.NET Framework 4向けのOAuthライブラリです。OAuthの詳細についてはhttp://oauth.net/を参照してください。
OAuth 1.0aに準拠しています。
現在確認中ですが、RFC 5849にも準拠していると思われます。
更にTwitterでの使用を強く意識しています。他のOAuth認証には使えない可能性があります。
また.NET 4に追加されたメソッドを使用しているため.NET 3.5以前のバージョンで使用するには一部修正が必要です。
本ライブラリはC#言語で実装されています。またコードサンプルもC#言語になりますが、VB.NETなど他の.NET言語でも利用可能です。
現在、開発版の位置づけでバージョン間のinterface互換はありません。
安定してきたら1.0にします。
このLibraryではOAuthBaseクラスが提供されます。Service Providerから提供される次の3つのURLを元に派生クラスを作成する必要があります。
Twitter向けには次のようなコードになります。お持ち帰り用のサンプルはこちら。 以降はこのサンプルを元に説明します。
public class TwitterOAuth: OAuthBase { public TwitterOAuth( NetworkCredential consumerCredential ): base( consumerCredential ) { } public TwitterOAuth( NetworkCredential consumerCredential, string callback ): base( consumerCredential ) { this.callback = callback; } readonly string callback; protected override Uri RequestToken { get { return new Uri( "http://twitter.com/oauth/request_token" ); } } protected override Uri Authorize { get { return new Uri( "http://twitter.com/oauth/authorize" ); } } protected override Uri AccessToken { get { return new Uri( "http://twitter.com/oauth/access_token" ); } } protected override string Callback { get { return callback ?? base.Callback; } } }
コンストラクタからもわかるように、このTwitterOAuthクラスを使用するにはService Providerから提供されるConsumer KeyとConsumer Secretが必要になります。
次にAccess Token、Token Secretを入手しますが、Desktop ApplicationとWeb Applicationとで手順が異なります。 Web Applicationはcallbackアドレスを指定します。
OAuthBase.GetAuthorizeAddress()メソッドにより認証用のURLを取得します。
var oauth = new TwitterOAuth( new NetworkCredential( "Consumer Key", "Consumer Secret" ) ); var url = oauth.GetAuthorizeAddress();
ここで得られたURL文字列でブラウザにアクセスしますと、Service ProviderはUserに対してConsumerによるアクセスを許可するか確認画面を表示します。
Userがアクセスを許可するとVerifier(確認コード)が表示されます。 このVerifierを使用してOAuthBase.GetAccessToken()メソッドを呼び出すことでAccess Tokenが得られます。
oauth.GetAccessToken( "Verifier" );
次回以降はAccess TokenとToken Secretを使用して直接初期化できます。
var oauth = new TwitterOAuth( new NetworkCredential( "Consumer Key", "Consumer Secret" ) ) { TokenCredential = new NetworkCredential( "Access Token", "Token Secret" ) };
Userの持つBASIC認証用のUsername / Passwordから直接Access TokenとToken Secretを取得できます。
var oauth = new TwitterOAuth( new NetworkCredential( "Consumer Key", "Consumer Secret" ) ); oauth.GetAccessToken( new NetworkCredential( "Username", "Password" ) );
まずTwitterOAuthのコンストラクタにコールバック用アドレスを渡してください。
OAuthBase.GetAuthorizeAddress()メソッドにより認証用のURLを取得します。
ここで得られたURL文字列にリダイレクトしてください。ASP.NETの場合はResponse.Redirect()メソッドが使えます。
var oauth = new TwitterOAuth( new NetworkCredential( "Consumer Key", "Consumer Secret" ). "callback address" ); Response.Redirect( oauth.GetAuthorizeAddress() );
リダイレクト先ではService ProviderがUserに対してConsumerによるアクセスを許可するか確認画面を表示します。
Userがアクセスを許可するとコンストラクタで指定したコールバックアドレスに戻ってきます。
この際、query stringにはAccess TokenとVerifier(確認コード)が付けられています。 この値を使用してOAuthBase.GetAccessToken()メソッドを呼び出すことでAccess Tokenが得られます。
ASP.NETの場合、Request.QueryStringプロパティが使えます。
oauth.GetAccessToken( Request.QueryString );
次回以降はAccess TokenとToken Secretを使用して直接初期化できます。
var oauth = new TwitterOAuth( new NetworkCredential( "Consumer Key", "Consumer Secret" ). "callback address" ) { TokenCredential = new NetworkCredential( "Access Token", "Token Secret" ) };
OAuthBase.GetResponse()メソッドを使用します。
methodには使用するHTTP Methodを指定します。WebRequestMethods.Http.GetとWebRequestMethods.Http.Postに対応しています。
uriにはProtected ResourcesにアクセスするためのURLを指定します。
parametersには追加パラメーターを指定します。GETの場合、query stringになります。POSTの場合、application/x-www-form-urlencodedにより送信されます。 追加パラメーターはuriに指定してはいけません。
WebResponseが返されますので、通常のデータ処理をしてください。
var response = oauth.GetResponse( WebRequestMethods.Http.Get, new Uri( "Protected Resource Address" ), new NameValueCollection() );
Protected Resourcesの取得 その1とは全く異なるアクセス方法を提供しています。
TwitterOAuth.Register()メソッドとTwitterOAuth.Credentialsプロパティを使用します。初期化方法は同じです。
var oauth = new TwitterOAuth( new NetworkCredential( "Consumer Key", "Consumer Secret" ) ) { TokenCredential = new NetworkCredential( "Access Token", "Token Secret" ) }; oauth.Register();
Protected ResourcesへのアクセスはWebRequestクラスを使用します。 この際、WebRequest.CredentialsプロパティにはTwitterOAuth.Credentialsを設定します。
query stringが含まれる場合、通常通りURLに含めます。
var request = WebRequest.Create( "Protected Resource Address" ); request.Credentials = oauth.Credentials; var response = reques.GetResponse();
POSTデータがある場合はWebRequest.GetRequestStream()ではなくOAuthUtility.Postメソッドを使用します。
var request = (HttpWebRequest)WebRequest.Create( "Protected Resource Address" ); request.Credentials = oauth.Credentials; request.ServicePoint.Expect100Continue = false; request.Posst( new NameValueCollection { { "key", "value" }, { "key", "value" }, }); var response = reques.GetResponse();
ライセンスはGPL v2とします。変更するかもしれません。
OAuth Library Version 0.4
ついったーでどうぞ。倉田 佐祐理