Windows Phone 8にTwitter OAuthを組み込む

Windows Phone 8Twitter OAuthを行う方法です。PINコードをユーザーに入力してもらって認証します。

Twitter Developerですでにアプリケーションを登録していることを前提として進めます。登録したアプリケーションのCallback URLは空にしておいてください。

まずは認証用のライブラリをインストールします。@neueccさんの作られたAsyncOAuthを使います。
NuGetパッケージ管理から検索窓にAsyncOAuthと入力すれば出てきます。インストールボタンをクリックしてインストールします。


次に、MainPage.xamlのContentPanelを以下のように書き換えます。

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <StackPanel>
        <phone:WebBrowser x:Name="browser" Height="460" />
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" VerticalAlignment="Center" FontSize="32">PIN</TextBlock>
            <TextBox Grid.Column="1" x:Name="pinCode"></TextBox>
            <Button Grid.Column="2" HorizontalAlignment="Right" Click="Button_Click">認証</Button>
        </Grid>
    </StackPanel>
</Grid>


その次はMainPage.xaml.csを次のように変更します。
usingを追加します。

using AsyncOAuth;
using System.Security.Cryptography;


最後にメインとなるソースコードです。MainPage.xaml.csに追記します。consumerKeyとconsumerSecretはTwitterに登録した際のAPI keyとAPI secretになります。

static string consumerKey = "API key";
static string consumerSecret = "API secret";

private RequestToken _requestToken = null;

static MainPage()
{
    OAuthUtility.ComputeHash = (key, buffer) => { using (var hmac = new HMACSHA1(key)) { return hmac.ComputeHash(buffer); } };
}

// コンストラクター
public MainPage()
{
    InitializeComponent();

    Loaded += MainPage_Loaded;
}

async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    try
    {
        var authorizer = new OAuthAuthorizer(consumerKey, consumerSecret);

        var tokenResponse = await authorizer.GetRequestToken("https://api.twitter.com/oauth/request_token");

        _requestToken = tokenResponse.Token;

        var pinRequestUrl = authorizer.BuildAuthorizeUrl("https://api.twitter.com/oauth/authorize", _requestToken);

        browser.Navigate(new Uri(pinRequestUrl, UriKind.RelativeOrAbsolute));
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}



private async void Button_Click(object sender, RoutedEventArgs e)
{
    try
    {
        var authorizer = new OAuthAuthorizer(consumerKey, consumerSecret);
        var tokenResponse = await authorizer.GetAccessToken("https://api.twitter.com/oauth/access_token", _requestToken, pinCode.Text);

        // ここでAccessTokenを保存する
        var accessToken = tokenResponse.Token;

        // 後はAccessTokenを使ってTwitterのAPIを呼び出すだけ
        // 試しに自分の情報を取得してみます
        var client = OAuthUtility.CreateOAuthClient(consumerKey, consumerSecret, accessToken);
        var json = await client.GetStringAsync("https://api.twitter.com/1.1/account/verify_credentials.json");
        MessageBox.Show(json);
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

ここで実行してみましょう。もし例外が発生するようでしたらエミュレータの時刻を合わせてみましょう。時間がずれていると失敗します。うまくいけば以下のような画面が表示されます。

この画面からログインを行いPINコードを入力して認証ボタンを押すと、以下のようなメッセージが取得できていることが確認できます。

アクセストークンを保存しておけば後はTwitterAPIをたたくだけで利用できます。プロジェクトをアップしましたので、好きなようにダウンロードしてください。
TwitterOAuth.zip 直