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"のファイルを削除します。まだベータですので怪しいところはあります。ベータが取れたら解決されるでしょう。