CSharp で認証モジュールを作成しようとしています。ここでは、コンシューマー キーとシークレットのみを持つ 2 Legged OAuth の DotNetOpenAuth(DNOA) ライブラリを使用して、リクエストから署名を検証する必要があります。
DNOA を使用した 2 Legged OAuth のサンプル実装があれば、それが役に立ちます。そうでない場合は、実装方法に関するアイデアも機能します。どんな助けでも大歓迎です。
CSharp で認証モジュールを作成しようとしています。ここでは、コンシューマー キーとシークレットのみを持つ 2 Legged OAuth の DotNetOpenAuth(DNOA) ライブラリを使用して、リクエストから署名を検証する必要があります。
DNOA を使用した 2 Legged OAuth のサンプル実装があれば、それが役に立ちます。そうでない場合は、実装方法に関するアイデアも機能します。どんな助けでも大歓迎です。
DNOA を 2-legged OAuth で動作させることができなかったので、http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs を基本クラスとして使用して独自のコンシューマーを作成し、署名署名。あなたがする必要があるのは、それをサブクラス化し、署名メソッドを使用して http 認証ヘッダーを構築することです...
string sigMethodType = GetSigMethodType();
string ts, nonce, normalizedUrl, normalizedParams;
string sig = GenerateSignature(new Uri("http://some-endpoint-to-call"), "GET", out nonce, out ts, out normalizedUrl, out normalizedParams);
string header = "OAuth realm=\"" + normalizedUrl + "\"," +
OAuthConsumerKeyKey + "=\"" + ConsumerKey + "\"," +
OAuthSignatureMethodKey + "=\"" + "HMACSHA1SignatureType" + "\"," +
OAuthSignatureKey + "=\"" + sig + "\"," +
OAuthTimestampKey + "=\"" + ts + "\"," +
OAuthTokenKey + "=\"" + String.Empty + "\"," +
OAuthNonceKey + "=\"" + nonce + "\"," +
OAuthVersionKey + "=\"" + OAuthVersion + "\"";
認証ヘッダーを取得したら、Web リクエストを作成して送信するだけです...
var wr = (HttpWebRequest)HttpWebRequest.Create(messageEndpoint.Location);
wr.Headers.Add(HttpRequestHeader.Authorization, BuildAuthHeader(messageEndpoint));
wr.ContentType = messageEndpoint.ContentType;
wr.Method = CdwHttpMethods.Verbs[messageEndpoint.HttpMethod];
using (var resp = (HttpWebResponse)req.GetResponse())
{
switch (resp.StatusCode)
{
case HttpStatusCode.Unauthorized:
Assert.Fail("OAuth authorization failed");
break;
case HttpStatusCode.OK:
using (var stream = resp.GetResponseStream())
{
using (var sr = new StreamReader(stream))
{
var respString = sr.ReadToEnd();
}
}
break;
}
}
更新: 2-legged を devdefined の oauth コンシューマーと連携させることもできました。http://code.google.com/p/devdefined-tools/wiki/OAuthConsumer
var endPoint = new Uri("http://example.com/restendpoint.svc");
var ctx = new OAuthConsumerContext
{
ConsumerKey = "consumerkey1",
ConsumerSecret = "consumersecret1",
SignatureMethod = SignatureMethod.HmacSha1
};
var session = new OAuthSession(ctx, endPoint, endPoint, endPoint);
var respText = session.Request().Get().ForUri(endPoint).ToString();
空のコンストラクターまたはコンテキストを受け取るだけのオーバーロードがあればいいのですが、これはうまくいくようです。