Windows Phone 7でxAuthを使う
現時点ではWP7に対応しているOAuthライブラリがほとんどありません。唯一見つけたのが、Hammockというライブラリです。
これを使えば簡単にxAuthができます。まずはダウンロードして解凍します。バージョンは1.0.4。次はプロジェクトに「Hammock-Binaries\.NET 4.0\Windows Phone 7 CTP\Hammock.WindowsPhone.dll」を参照に追加します。
サンプルはTwitterの認証です。必要に応じて、ClientUsername, ClientPassword, ConsumerKey, ConsumerSecretを設定してください。
var client = new Hammock.RestClient() { Authority = "https://api.twitter.com/oauth", HasElevatedPermissions = true, Method = Hammock.Web.WebMethod.Post, Credentials = new Hammock.Authentication.OAuth.OAuthCredentials() { ClientUsername = "username", ClientPassword = "********", ConsumerKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx", ConsumerSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", SignatureMethod = Hammock.Authentication.OAuth.OAuthSignatureMethod.HmacSha1, ParameterHandling = Hammock.Authentication.OAuth.OAuthParameterHandling.HttpAuthorizationHeader, Type = Hammock.Authentication.OAuth.OAuthType.ClientAuthentication } }; var request = new Hammock.RestRequest() { Path = "access_token" }; client.BeginRequest(request, new Hammock.RestCallback((req, response, state) => { var query = response.Content.Split('&').Select(s => s.Split('=')).ToDictionary(k => k[0], k => k[1]); var token = query["oauth_token"]; var tokenSecret = query["oauth_token_secret"]; }));
oauth_tokenとoauth_token_secretを取得できれば、後はそれを使ってアクセスすればデータを取得できます。早速mentionsを取得してみましょう。
var client = new Hammock.RestClient() { HasElevatedPermissions = true, Method = Hammock.Web.WebMethod.Get, // APIによって変える Credentials = new Hammock.Authentication.OAuth.OAuthCredentials() { ConsumerKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx", ConsumerSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", Token = oauth_token, // ここに入れる TokenSecret = oauth_token_secret, // ここに入れる Type = Hammock.Authentication.OAuth.OAuthType.ProtectedResource // ProtectedResourceです } }; var request = new Hammock.RestRequest() { Path = "http://api.twitter.com/1/statuses/mentions.xml" }; client.BeginRequest(request, new Hammock.RestCallback((req, response, state) => { var content = response.Content; // Parse ... }));
しかし、これでうまく取得できない場合があります。それは、WP7 Request Token issuesでも問題になっていますが、エミュレータを初めて起動したときの時間に固定されてしまい、時間がずれてしまうようです。
それを対処するには"%ProgramData%\Microsoft\XDE\*.dess"のファイルを削除します。まだベータですので怪しいところはあります。ベータが取れたら解決されるでしょう。