OAuth認証
概要
OAuth認証の概要は以下のようになります。まずはサービスプロバイダ(Twitter,Facebook,Dropboxなど)に事前の登録処理が必要です。 2の手順によってアプリのConsumerKeyとConsumerKeySecretを取得できます。
1.ユーザー登録
2.アプリ登録
自分のアプリの名前をMyAppとしましょう。実際に使用するユーザーの制御フローは以下のようになります。
3.ユーザーをAuthorizeページへナビゲート
4.MyAppのページでアクセストークンを取得
5.取得したアクセストークンをMyAppの設定ファイルかデータベースへ保存
6.アクセストークンを利用してAPI呼出し
この手順の中で3と4が各サービスプロバイダによって微妙に異なります。各プロバイダごとに解説していきます。 OAuth認証の処理を自分で実装するのは非常に手間がかかります。 OAuth認証を行うライブラリとしてHigLaboがあります。これを利用して解説していきます。
Twitterの場合
ユーザー登録&アプリの登録
twitter.com
Twitterと連携するWEBアプリの作成について解説します。WEBアプリの名前はMyAppということにしましょう。 連携機能を作るためにはまずはTwitterのユーザー登録とアプリ登録をする必要があります。 Twitterはhttp://twitter.com/へ行くとユーザー登録が可能です。ユーザー登録後、設定画面からアプリの登録ができます。 アプリ登録をするとConsumerKeyとConsumerKeySecretが与えられこの値を使ってAPIへのアクセスができるようになります。
アクセストークン取得までの流れ
アクセストークンを取得するまでのデータとサイトの制御フローは以下のようになります。
3.ユーザーをAuthorizeページへナビゲート
4.MyAppのページでアクセストークンを取得
5.取得したアクセストークンをMyAppの設定ファイルかデータベースへ保存
のアイコンがある部分(2箇所)を自分で実装する必要があります。
Authorizeページへナビゲート
MyAppのどこかにTwitterのAuthorizeページへ移動するリンクを作成します。 このリンクのサーバー側のコードでRequestTokenとRequestTokenSecretを元にAuthorizeページのURLを作成します。
var cl = TwitterClient.CreateOAuthClient("ConsumerKey", "ConsumerKeySecret");
ai = cl.GetAuthorizeInfo();
var requestToken = ai.RequestToken;
var requestTokenSecret = ai.RequestTokenSecret;
var url = ai.AuthorizeUrl;
ここで使用したRequestTokenとRequestTokenSecretはアクセストークンの取得時に再利用するのでどこかに保存しておく必要があります。 保存後、取得したAuthorizeページのURLへリダイレクトします。AuthorizeページのURLは以下のような形式になります。 リダイレクト後、Twitterのページで認証を求められます。(2012/02/07の画面デザイン)
Twitterのドメインで認証をすることで、Twitterはユーザーにわかりやすい画面を表示しユーザーの確認を促した上で MyAppに対して適切なアクセスコントロールを設定できます。今回の場合Tweetの取得とStatusのアップデートの権限を要求しています。 パスワードを見る権限は要求していません。そのことをユーザーが確認することができます。 この画面が表示されるURLのドメインがtwitter.comでない場合は危険なサイトの可能性があるので注意しましょう。
アクセストークンを取得
認証が終了するとアプリの登録時に指定したコールバックURLへリダイレクトされます。 クエリ文字列にoauth_tokenoauth_verifierという値が付与されてリダイレクトされます。 これらの値を使ってアクセストークンを取得します。 アプリキー、アプリの秘密キー、RequestToken、RequestTokenSecretを使ってTwitterのアクセストークン取得用のURLへPOSTします。
var cl = TwitterClient.CreateOAuthClient("ConsumerKey", "ConsumerKeySecret");
AccessTokenInfo t = cl.GetAccessToken("RequestToken", "RequestTokenSecret");
レスポンスのボディは以下のような文字列が返ってきます。
oauth_token=abc...z&oauth_token_secret=abc...z
その文字列を解析したクラスがAccessTokenInfoクラスです。 API呼出のときにこのTokenプロパティとTokenSecretプロパティが必要なので保存しておきましょう。
var token = t.Token;
var tokenSecret = t.TokenSecret;
自分で作成が必要な部分はどこか?
ライブラリを利用すれば大部分の複雑な処理を作成せずに済みます。作成が必要な箇所は2つになります。
1.Authorizeページへ遷移するリンク
2.コールバックページでアクセストークンを取得する部分
それぞれのサンプルを以下に示します。 SaveToStorageメソッドは値を保存するメソッド、GetFromStorageメソッドは保存した値を取得するためのメソッドです。
Authorizeページへ遷移するリンクの実装例
var cl = TwitterClient.CreateOAuthClient("ConsumerKey", "ConsumerKeySecret");
AccessTokenInfo t = cl.GetAccessToken("RequestToken", "RequestTokenSecret");
SaveToStorage("RequestToken", ai.RequestToken);
SaveToStorage("RequestTokenSecret", ai.RequestTokenSecret);
res.Redirect(ai.AuthorizeUrl);
コールバックページでアクセストークンを取得する部分
var cl = TwitterClient.CreateOAuthClient("ConsumerKey", "ConsumerKeySecret");
String rToken = GetFromStorage("RequestToken");
String rTokenSecret = GetFromStorage("RequestTokenSecret");
AccessTokenInfo t = cl.GetAccessToken(rToken, rTokenSecret));
SaveToStorage("Token", t.Token);
SaveToStorage("TokenSecret", t.TokenSecret);
アクセストークンを利用してAPI呼出し
APIを呼び出すときに必要なデータはアプリキー、アプリの秘密キー、アクセストークン、アクセストークンの秘密キーの4つです。 APIを呼び出すときにはこれらの値を元にシグネチャを生成しリクエストヘッダにセットしてAPIをコールする必要があります。 リクエストヘッダにAuthorizationというキーで生成した値を設定してAPIを呼び出します。 HigLaboでは内部でこれらの処理を行ってくれます。上記の4つの値があれば以下のように書くとHomeのタイムラインが取得可能です。
var cl = new TwitterClient("ConsumerKey", "ConsumerKeySecret", "AccessToken", "AccessTokenSecret");
var rs = cl.GetHomeTimeline();
foreach (var status in rs)
{
    //Do something...
}
Facebookの場合
ユーザー登録&アプリの登録
www.facebook.com
facebookと連携するWEBアプリの作成について解説します。WEBアプリの名前はMyAppということにしましょう。 連携機能を作るためにはまずはfacebookのユーザー登録とアプリ登録をする必要があります。 facebookはhttp://www.facebook.com/へ行くとユーザー登録が可能です。ユーザー登録後、設定画面からアプリの登録ができます。 アプリ登録をするとConsumerKeyとConsumerKeySecretが与えられこの値を使ってAPIへのアクセスができるようになります。
アクセストークン取得までの流れ
アクセストークンを取得するまでのデータとサイトの制御フローは以下のようになりTwitterの場合とほぼ同じ形です。 ConsumerKeyがあれば認証URLを簡単に生成できるという部分がTwitterと異なります。 またアクセストークンの取得時に必要な値がクエリ文字列で渡されるcodeの値だけでよいという点も異なります。
Authorizeページへナビゲート
保存後、取得したAuthorizeページのURLへリダイレクトします。AuthorizeページのURLは以下のような形式になります。 facebookのページで認証を求められます。(2012/02/13の画面デザイン)
アクセストークンを取得
認証が終了するとアプリの登録時に指定したコールバックURLへリダイレクトされます。 このときクエリ文字列にcodeという値が付与されます。この値とコールバックURLに指定した値を使用してアクセストークンを取得します。
String OAuthCallbackUrl = "http://......";
t = FacebookClient.GetAccessToken("ConsumerKey", "ConsumerKeySecret", OAuthCallbackUrl, code);
SaveToStorage("Token", t.Token);
アクセストークンを利用してAPI呼出し
FacebookのAPIを呼び出すときに必要なデータはアクセストークンだけです。 HigLaboでは内部でこれらの処理を行ってくれます。以下のように書くとユーザーの情報が取得可能です。
var cl = new FacebookClient("AccessToken");
var user = cl.GetUser("me");
String name = user.Name;
Create at 2012/2/4 LastUpdate 2012/2/13