なか日記

一度きりの人生、楽しく生きよう。

Windowsストアアプリ:CoreTweetを使ったTwitter認証(PINコード未使用)

昨日のだるやなぎ呑み会でちょっと話題になったので調べてみました。

確か、

WindowsストアアプリでCoreTweet使う時に、PINコード使わずに認証するのってどうやったらええん?

みたいな話だったと思います*1

WebAuthenticationBrokerを使うと簡単に実装できた

コードはこんな感じ。

var apiKey = "{API Key}";
var apiSecret = "{API Secret}";
var callback = "http://127.0.0.1:64003/Account/ExternalLoginCallback";
var uriCallback = new Uri(callback);

var oAuthSession = await OAuth.AuthorizeAsync(apiKey, apiSecret , callback);
var webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, oAuthSession.AuthorizeUri, uriCallback);

if (webAuthenticationResult.ResponseStatus == WebAuthenticationStatus.Success)
{
    //http://127.0.0.1:64003/Account/ExternalLoginCallback?oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&oauth_verifier=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
    var oauthVerifier =
        webAuthenticationResult.ResponseData.Split('&').First(x => x.Contains("oauth_verifier")).Split('=')[1];
    var token = await oAuthSession.GetTokensAsync(oauthVerifier);
    await token.Statuses.UpdateAsync(status => "テスト");
}

事前準備

事前に Twitter Application Management にてアプリケーションの登録して、APIキー等を取得しておく必要がありますが、その辺は省略します。

認証画面の表示

OAuthSessionインスタンスを取得するのはいつもの感じですね。

WebAuthenticationBrokerのAuthenticateAsyncメソッドに認証用のURLを渡して呼び出すと、下の様なTwitterの認証画面が表示されます。

f:id:nakaji999:20141102020917p:plain

ここで、アプリケーションの使用を許可してあげればOKです。

f:id:nakaji999:20141102020927p:plain

認証後の処理

認証に成功したかどうかは webAuthenticationResult.ResponseStatus でわかります。

成功していると webAuthenticationResult.ResponseData に以下の様なURL(Twitter認証後にリダイレクトされるURL)が格納されていますので、oauth_verifierの値をどうにかして取得します*2

http://127.0.0.1:64003/Account/ExternalLoginCallback?oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&oauth_verifier=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

トークンの取得

oauth_verifierの値をOAuthSessionインスタンスのGetTokensAsyncメソッドに渡すと、トークンが取得できます。

所感

WebAuthenticationBroker便利ですね!

実は、Windowsストアアプリ作ったことない(プロジェクト作った事すら、過去10回もないくらい)のですが、おかげでちょっと触れることができました。

聞いてくれただるやなぎさん、ありがとう。

*1:呑みすぎて記憶が曖昧…

*2:サンプルコードは無理矢理な感がありますが、もっと綺麗な書き方があると思います