0

これは私がこれまでに持っているものですが、DotNetOpenAuth がどのように機能するのか理解していないため、機能していません。キーで結果に署名するためだけに必要ですが、運がありません。クライアントにアクセスを承認させる必要があることをすべて示しているようですが、このリクエストにはユーザーが必要ないため、署名する必要があります。

http://developer.netflix.com/docs/read/Securityの「Netflix API リクエスト」セクションを参照してください。

public class class1
{
    private void Main()
    {
        string consumerKey = "<MyAPIKey>";
        string consumerSecret = "<MyAPISharedSecret>";
        var tokenManager = new InMemoryTokenManager(consumerKey, consumerSecret);

        MessageReceivingEndpoint oauthEndpoint =
            new MessageReceivingEndpoint(new Uri("http://api-public.netflix.com/catalog/titles/index"),
                                         HttpDeliveryMethods.PostRequest);
        WebConsumer consumer = new WebConsumer(
            new ServiceProviderDescription
                {
                    RequestTokenEndpoint = oauthEndpoint,
                    UserAuthorizationEndpoint = oauthEndpoint,
                    AccessTokenEndpoint = oauthEndpoint,
                    TamperProtectionElements =
                        new ITamperProtectionChannelBindingElement[] { new HmacSha1SigningBindingElement()},
                },
            tokenManager);


        var result = consumer.Channel.Request(new AccessProtectedResourceRequest());


    }

    internal class InMemoryTokenManager : IConsumerTokenManager
    {
        private Dictionary<string, string> tokensAndSecrets = new Dictionary<string, string>();

        public InMemoryTokenManager(string consumerKey, string consumerSecret)
        {
            if (string.IsNullOrEmpty(consumerKey))
            {
                throw new ArgumentNullException("consumerKey");
            }

            this.ConsumerKey = consumerKey;
            this.ConsumerSecret = consumerSecret;
        }

        public string ConsumerKey { get; private set; }

        public string ConsumerSecret { get; private set; }

        public string GetTokenSecret(string token)
        {
            return this.tokensAndSecrets[token];
        }

        public void StoreNewRequestToken(UnauthorizedTokenRequest request, ITokenSecretContainingMessage response)
        {
            this.tokensAndSecrets[response.Token] = response.TokenSecret;
        }

        public void ExpireRequestTokenAndStoreNewAccessToken(string consumerKey, string requestToken, string accessToken,
                                                             string accessTokenSecret)
        {
            this.tokensAndSecrets.Remove(requestToken);
            this.tokensAndSecrets[accessToken] = accessTokenSecret;
        }

        public TokenType GetTokenType(string token)
        {
            throw new NotImplementedException();
        }
    }
}
4

1 に答える 1

3

あなたの実際の質問は、「DotNetOpenAuth を使用して、アクセス トークンの有無にかかわらずリクエストに署名することは可能ですか?」のようなものである必要があります。 .

DotNetOpenAuth に関するドキュメントは 1 ページもありません。また、コードベースが非常に巨大であるため、それを読んで何がサポートされているかを理解することもできません。

認証されていないリクエストを作成することは、リクエストに追加されたクエリ文字列パラメーターにすぎないため、問題ではないと思います。

ただし、署名付きリクエストを作成するには、簡単なプロセスに従う必要があります。

  1. リクエスト パラメータの収集
  2. 署名の計算
  3. リクエストの作成 (署名/保護)

リクエスト パラメータの収集

これらは基本的に、oauth 固有のパラメーターと Netflix API 固有のパラメーターの 2 つのカテゴリーのパラメーターです。

OAuth 固有のパラメータには がnonceあります。これは、ノンス値を生成するために使用できるコードです。

public static string GenerateNonce()
{
    byte[] bytes = new byte[32];
    var first = Guid.NewGuid().ToByteArray();
    var second = Guid.NewGuid().ToByteArray();
    for (var i = 0; i < 16; i++)
        bytes[i] = first[i];
    for (var i = 16; i < 32; i++)
        bytes[i] = second[i - 16];
    var result = Convert.ToBase64String(bytes, Base64FormattingOptions.None);
    result = new string(result.ToCharArray().Where(char.IsLetter).ToArray());
    return result;
}

もう 1 つの OAuth 固有のパラメーターは ですtimestamp。これは、タイムスタンプの計算に使用できるコードです。

DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds

その他の oauth 固有のパラメーターは簡単にプロビジョニングでき、特定のコードを記述する必要はありません。

API 固有のパラメーターは、クエリ文字列または認証ヘッダー (oauth_signature 自体を除く) またはボディ リクエスト (リクエストのコンテンツ タイプが application/x-www-form-urlencoded の場合) に追加する任意の値です。

署名の計算

署名されたリクエストまたは保護された署名を作成するには、署名を計算する必要があります。署名キーを作成する方法を除いて、プロセスはほぼ同じです。

  1. 署名ベース文字列を計算する
  2. 署名鍵を計算する
  3. 署名鍵を使用して署名ベース文字列に署名して署名を作成する

署名ベース文字列を計算するには、最初にすべてのパラメーターを文字列に連結し、文字列全体をパーセントでエンコードする必要があります。これは、パーセント エンコーディングを行うのに役立つコードです。

public static string Encode(string source)
{
    Func<char, string> encodeCharacter = c => {
        if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c == '.' || c == '-' || c == '_' || c == '~'))
            return new string(c, 1);
        return EncodeCharacter(c);
    };
    return string.Concat(source.ToCharArray().Select(encodeCharacter));
}

また、パラメーターをアルファベット順に並べ替え、「&」を使用して連結する必要があります。これを行うために記述しなければならないコードは次のとおりです。

public static string CalculateParameterString(KeyValuePair<string, string>[] parameters)
{
    var q = from entry in parameters
            let encodedkey = PercentEncode.Encode(entry.Key)
            let encodedValue = PercentEncode.Encode(entry.Value)
            let encodedEntry = encodedkey + "=" + encodedValue
            orderby encodedEntry
            select encodedEntry;
    var result = string.Join("&", q.ToArray());
    return result;
}

上記の文字列を「パラメーター文字列」と呼びましょう。次に、署名のベース文字列を計算するには、リクエストの http 動詞、リクエストの URL、パラメータ文字列を「&」を使用して連結するだけです。また、最初にパーセントでエンコードする必要があります。これを行うコードは次のとおりです。

public static string CalcualteSignatureBaseString(string httpMethod, string baseUri, string parametersString)
{
    return httpMethod.ToUpper() + "&" + PercentEncode.Encode(baseUri) + "&" + PercentEncode.Encode(parametersString);
}

署名ベース文字列を作成したら、次のステップは署名キーを計算することです。

  • 署名されたリクエストを作成する必要がある場合は、コンシューマー キー (共有シークレット) のみに基づいて署名キーを作成します。これは、署名されたリクエストを作成するために使用される署名キーです。
  • 承認プロセス中に、リクエスト トークン リクエストを作成し、一時的な oauth トークンを受け取った場合、歌唱キーはコンシューマ キーとその oauth トークンに基づいています。これは、アクセス トークンを取得するための要求を行うために使用される署名キーです。
  • ユーザーがアプリケーションを承認し、関連するアクセス トークンを持っている場合、署名キーはコンシューマー キーとアクセス トークンになります。これは、保護されたリクエストを行うための署名キーです。

これは、署名キーを生成するコードです。

public static string GetSigningKey(string ConsumerSecret, string OAuthTokenSecret = null)
{
    return ConsumerSecret + "&" + (OAuthTokenSecret != null ? OAuthTokenSecret : "");
}

あなたの場合、署名付きリクエストを作成するには、nullOAuthTokenSecret パラメータの値を渡すだけです。

これで、署名のベース文字列ができました。あとは、HMAC-SHA1 アルゴリズムを使用して署名するだけです。

public static string Sign(string signatureBaseString, string signingKey)
{
    var keyBytes = System.Text.Encoding.ASCII.GetBytes(signingKey);
    using (var myhmacsha1 = new System.Security.Cryptography.HMACSHA1(keyBytes)) {
        byte[] byteArray = System.Text.Encoding.ASCII.GetBytes(signatureBaseString);
        var stream = new MemoryStream(byteArray);
        var signedValue = myhmacsha1.ComputeHash(stream);
        var result = Convert.ToBase64String(signedValue, Base64FormattingOptions.None);
        return result;
    }
}

要約すると、これは署名を計算するためのプロセス全体です。

    public virtual string GetSignature(string consumerSecret, string tokenSecret, string uri, string method, params ParameterSet[] parameters)
    {
        var allParameters = parameters.SelectMany(p => p.ToList()).ToArray();
        var parametersString = CalculateSignatureBaseString(allParameters);
        var signatureBaseString = OAuth1aUtil.CalcualteSignatureBaseString(method, uri, parametersString);
        var sigingKey = GetSigningKey(consumerSecret, tokenSecret);
        var signature = Sign(signatureBaseString, sigingKey);
        return signature;
    }

依頼する

有効な http リクエストを作成し、oauth パラメータを「Authorization」ヘッダーとしてリクエストに追加するだけです。

于 2012-09-18T06:49:26.440 に答える