Проверка подписанных запросов от Gmail контекстного гаджета - PullRequest
4 голосов
/ 15 сентября 2010

Итак, я использую 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;

Я получил гаджет customerKey и consumerSecret от https://www.google.com/gadgets/directory/verifyСогласно документации 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=

Затем я подписываю этот запрос в соответствии с той же спецификацией OAuth, которую должен использовать Google, но подписи не совпадают.

Я уже пытался подписатьзапрос с использованием двух разных библиотек:

  1. Наша собственная библиотека .Net, которая используется для подписи запросов на авторизацию Gmail IMAP OAuth (которая использует тот же метод подписи, и там он прекрасно работает).
  2. Одна из предоставленных библиотек opensocial (http://code.google.com/p/opensocial-net-client/)

Обе библиотеки генерируют одинаковые базовые строки сигнатур. Однако, как ни странно, они создают разные сигнатуры, и ни одна из этих сигнатур не соответствуетотправленный Google в параметре oauth_signature!

Товарищи разработчики гаджетов, надеюсь, кому-то из вас повезло больше, чем мне, и он подписал эту подписьРаботает метод проверки.Пожалуйста, скажите мне, что я делаю здесь не так.

Заранее спасибо,Буру

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Метод Дэниелса отлично работает с одним небольшим изменением.

  • GetQueryParameters требует реализации для получения всех параметров запроса. Реализация в OAuthBase возвращает только те, которые не имеют префикса 'oauth _'

Моя основная проблема заключалась в том, что гаджет, выполняющий вызов, использовал gadgets.io.makeRequest для 'http://myserver.com',, но страница обработки была' http://myserver.com/default.aspx'. Подпись не проверялась из-за этой разницы. Вызов 'http://myserver.com/default.aspx' с использованием gadgets.io.makeRequest изнутри Гаджета решает проблемы.

1 голос
/ 19 мая 2011

Я успешно использовал это:

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

РЕДАКТИРОВАТЬ : при отправке запросов и отправке параметров черезполучить или опубликовать это не сработало.Похоже, проблема в том, что Gmail сортирует параметры по буквам в верхнем регистре.Я прибегнул к использованию только строчных параметров, но вы могли легко исправить код, чтобы убедиться, что заглавные буквы идут перед строчными.

...