OAuth Library for .NET 4

.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にします。

Usage

事前準備

この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アドレスを指定します。

Access Token、Token Secretの入手 - Desktop Application

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" )
};

Access Token、Token Secretの入手 - Desktop Application、xAuth

Userの持つBASIC認証用のUsername / Passwordから直接Access TokenとToken Secretを取得できます。

var oauth = new TwitterOAuth( new NetworkCredential( "Consumer Key", "Consumer Secret" ) );
oauth.GetAccessToken( new NetworkCredential( "Username", "Password" ) );

Access Token、Token Secretの入手 - Web Application

まず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" )
};

Protected Resourcesの取得 その1

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の取得 その2

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();

Lisence and Download

ライセンスはGPL v2とします。変更するかもしれません。
OAuth Library Version 0.4

TODO

Contact

ついったーでどうぞ。倉田 佐祐理

History

2010/07/05
oauth_timestampの誤りを修正。Version 0.4
2010/05/30
.NET 3.5向けバイナリを同梱。Version 0.35
2010/03/05
xAuthに対応。Version 0.3
2010/03/03
Web Applicationでの認証に対応。Version 0.2
2010/02/28
初公開。Version 0.1