3

そのgadgets.io.makeRequest(url, callback, params)ため、Gmail コンテキスト ガジェットからリクエストを作成し、これらのリクエストをサーバー側で検証するために使用しています。

明確にするために、ガジェット側で次の makeRequest パラメータを使用しています。

params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.DOM;
params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
params["OAUTH_SERVICE_NAME"] = "HMAC";
params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.GET;

https://www.google.com/gadgets/directory/verify からガジェットのconsumerKeyとconsumerSecretを取得しましたGoogleのドキュメントによると、リクエストはOAuth署名プロセスHMAC-SHA1メソッド
に従ってコンテナによって署名されています。

サーバー側では、次のリクエストを受け取ります。

http://my.dev.machine.com/blapage.aspx?oauth_body_hash=2jmj7l5rSw0yVb/vlWAYkK/YBwk=&opensocial_owner_id=103030060674287937707&opensocial_viewer_id=103030060674287937707&opensocial_app_id=103129310198020657787&opensocial_app_url=http://my.dev.machine.com/gadget.xml&oauth_version=1.0&oauth_timestamp =1284403586&oauth_nonce=6436223395511631796&opensocial_container=http://mail.google.com&oauth_consumer_key=419336943235&oauth_signature_method=HMAC-SHA1&oauth_signature=bshZj9XOXECdYiyR1J8Etnadv5c=

次に、Google が使用するはずの同じ OAuth 仕様に従ってこのリクエストに署名していますが、署名が一致しません。

私はすでに2つの異なるライブラリを使用してリクエストに署名しようとしました:

  1. Gmail の IMAP OAuth 承認のリクエストに署名するために使用される自社開発の .Net lib (同じ署名方法を使用し、そこでは問題なく動作します)。
  2. 寄贈されたオープンソーシャル ライブラリの 1 つ ( http://code.google.com/p/opensocial-net-client/ )

どちらのライブラリも同様の署名ベース文字列を生成します。しかし、奇妙なことに、それらは異なる署名を生成し、これらの署名のいずれも oauth_signature パラメータで Google から送信されたものと一致しません!

ガジェット開発者の皆さん、あなたの誰かが私より幸運で、この署名検証方法が機能することを願っています。ここで何が間違っているのか教えてください。

前もってありがとう、
ぶる

4

2 に答える 2

1

私はこれをうまく使いました:

public Boolean ValidateSignature(String method, Uri url)
        {
            String normalizedUrl, normalizedRequestParameters;

            List<QueryParameter> parameters = new List<QueryParameter>();
            parameters.AddRange(GetQueryParameters(url.Query));

            var sigParam = parameters.Find(p => p.Name == OAuthSignatureKey);
            if (sigParam == null)
                return false;
            var expected = sigParam.Value;

            parameters.Remove(parameters.Find(p => p.Name == OAuthSignatureKey));
            parameters.Sort(new QueryParameterComparer());

            normalizedUrl = string.Format("{0}://{1}", url.Scheme, url.Host);
            if (!((url.Scheme == "http" && url.Port == 80) || (url.Scheme == "https" && url.Port == 443)))
            {
                normalizedUrl += ":" + url.Port;
            }
            normalizedUrl += url.AbsolutePath;
            normalizedRequestParameters = NormalizeRequestParameters(parameters);

            StringBuilder signatureBase = new StringBuilder();
            signatureBase.AppendFormat("{0}&", method.ToUpper());
            signatureBase.AppendFormat("{0}&", UrlEncode(normalizedUrl));
            signatureBase.AppendFormat("{0}", UrlEncode(normalizedRequestParameters));

            HMACSHA1 hmacsha1 = new HMACSHA1();
            hmacsha1.Key = Encoding.ASCII.GetBytes(string.Format("{0}&{1}", UrlEncode(ConsumerSecret), ""));//string.IsNullOrEmpty(tokenSecret) ? "" : UrlEncode(tokenSecret)));

            var computed = GenerateSignatureUsingHash(signatureBase.ToString(), hmacsha1);
            return expected == UrlEncode(computed);
        } 

ここで見つけることができるコードと一緒に:http: //oauth.googlecode.com/svn/code/csharp/OAuthBase.cs

編集:リクエストを作成し、getまたはpostを介してパラメーターを送信すると、これは機能しませんでした。問題のように思われるのは、Gmailがパラメータを大文字でソートすることです。私は小文字のパラメーターのみを使用することにしましたが、コードを簡単に修正して、大文字が小文字の前に来るようにすることができます。

于 2011-05-19T12:10:09.303 に答える
1

Daniels メソッドは、1 つの小さな変更で正常に機能します。

  • GetQueryParameters には、すべてのクエリ パラメータを取得するための実装が必要です。OAuthBase の実装は、'oauth_' のプレフィックスが付いていないもののみを返します

私の主な問題は、呼び出しを行っている Gadget が「http://myserver.com」に対して gadgets.io.makeRequest を使用していたのに、処理ページが「http://myserver.com/default.aspx」だったことです。この違いにより、署名は検証されませんでした。ガジェット内から gadgets.io.makeRequest を使用して「http://myserver.com/default.aspx」を呼び出すと、問題が解決しました。

于 2011-09-06T09:27:06.690 に答える