Google OAuthGetRequestToken возвращает "signature_invalid" - PullRequest
3 голосов
/ 16 ноября 2011

Пытаясь часами получить токен запроса , используя Google OAuthGetRequestToken, но он всегда возвращает «signature_invalid».

Для теста я использую oAuth Playground , чтобы успешнозапросить токен.Вот результаты:

Базовая строка подписи

  GET&https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthGetRequestToken&oauth_callback%3Dhttp%253A%252F%252Fgooglecodesamples.com%252Foauth_playground%252Findex.php%26oauth_consumer_key%3Dwww.embeddedanalytics.com%26oauth_nonce%3D56aa884162ed21815a0406725c79cf79%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D1321417095%26oauth_version%3D1.0%26scope%3Dhttps%253A%252F%252Fwww.google.com%252Fanalytics%252Ffeeds%252F

Запрос / Ответ

GET /accounts/OAuthGetRequestToken?scope=https%3A%2F%2Fwww.google.com%2Fanalytics%2Ffeeds%2F HTTP/1.1
Host: www.google.com
Accept: */*
Authorization: OAuth oauth_version="1.0", oauth_nonce="56aa884162ed21815a0406725c79cf79", oauth_timestamp="1321417095", oauth_consumer_key="www.embeddedanalytics.com", oauth_callback="http%3A%2F%2Fgooglecodesamples.com%2Foauth_playground%2Findex.php", oauth_signature_method="RSA-SHA1", oauth_signature="qRtorIaSFaQdOXW1u6eMQlY9LT2j7ThG5kgkcD6rDcW4MIvzluslFgYRNTuRvnaruraNpItjojtgsrK9deYRKoHBGOlU27SsWy6jECxKczcSECl3cVAcjk7dvbywFMDkgi1ZhTZ5Q%2BFoD60HoVQUYnGUbOO0jPXI48LfkiA5ZN4%3D"

HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Date: Wed, 16 Nov 2011 04:18:15 GMT
Expires: Wed, 16 Nov 2011 04:18:15 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Length: 118
Server: GSE

oauth_token=4%2FmO86qZzixayI2NoUc-hewC--D53R&oauth_token_secret=r0PReF9D83w1d6uP0nyQQm9c&oauth_callback_confirmed=true

Я используюСкрипач, чтобы отслеживать мои звонки.Возвращает базовую строку Signature:

GET&https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthGetRequestToken&oauth_callback%3Dhttp%253A%252F%252Fgooglecodesamples.com%252Foauth_playground%252Findex.php%26oauth_consumer_key%3Dwww.embeddedanalytics.com%26oauth_nonce%3Dl9Jydzjyzt2fJfM3ltY5yrxxYy2uh1U7%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D1321417107%26oauth_version%3D1.0%26scope%3Dhttps%253A%252F%252Fwww.google.com%252Fanalytics%252Ffeeds%252F

Помимо oauth_timestamp и oauth_nonce (которые должны отличаться), базовая строка в значительной степени идентична.

Кто-нибудь знает, что я делаю неправильно?

Обновление 11/20/2011 Думая, что это может быть что-то не так с моей подписью RSA-SHA, я с тех пор попробовал HMAC-SHA.Это дает те же результаты.Я подумал, что было бы полезно включить результаты Fiddler (я добавил возврат каретки, чтобы улучшить его формат).

GET https://www.google.com/accounts/OAuthGetRequestToken?
scope=https%3A%2F%2Fwww.google.com%2Fanalytics%2Ffeeds%2F HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Authorization: OAuth oauth_version="1.0",
oauth_nonce="7C4C900EAACC9C7B62E399A91B81D8DC",
oauth_timestamp="1321845418",
oauth_consumer_key="www.embeddedanalytics.com",
oauth_signature_method="HMAC-SHA1",
oauth_signature="ows%2BbFTNSR8jVZo53rGBB8%2BfwFM%3D"
Host: www.google.com
Accept: */*
Accept-Encoding: identity

Ответ

HTTP/1.1 400 Bad Request
Content-Type: text/plain; charset=UTF-8
Date: Mon, 21 Nov 2011 03:16:57 GMT
Expires: Mon, 21 Nov 2011 03:16:57 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Length: 358
Server: GSE

signature_invalid
base_string:GET&https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthGetRequestToken
&oauth_consumer_key%3Dwww.embeddedanalytics.com
%26oauth_nonce%3D7C4C900EAACC9C7B62E399A91B81D8DC
%26oauth_signature_method%3DHMAC-SHA1
%26oauth_timestamp%3D1321845418
%26oauth_version%3D1.0
%26scope%3Dhttps%253A%252F%252Fwww.google.com%252Fanalytics%252Ffeeds%252F

Обновление 11/24 /2011 - Я хочу добавить больше информации на основе ответов @Meysam и @Bob Aman.Во-первых, мой домен правильно зарегистрирован в Google.Я уже довольно давно использую AuthSub с Префиксом целевого URL-пути , установленным на http://www.embeddedanalytics.com/authsubsuccess.html. Теперь, когда я перехожу в раздел «Управление доменами», в нем указывается мой потребительский ключ oAuth www.embeddedanalytics.com .Теперь, возможно, это может быть проблемой.В документе Регистрация для веб-приложений указано:

Если вы используете интерфейс OAuth, этот URL-адрес (префикс пути целевого URL-адреса) должен соответствоватьзначение параметра oauth_consumer_key

В моем случае целевой URL отличается от моего oauth_consumer_key.Может ли это быть проблемой?Я использую www.embeddedanalytics.com в качестве ключа_потребителя на игровой площадке, и он работает.Я не хочу связываться с целевым URL-адресом, поскольку в настоящее время он используется с моими авторизациями AuthSub.

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Я предполагаю, что вы не зарегистрировали домен своего приложения в Google. Поэтому, все, что consumer secret вы используете для подписания вашего запроса (в методе HMAC-SHA1), будет отклонено, если вы не укажете anonymous в качестве oauth_consumer_key и consumer secret. Таким образом, Google распознает вас как незарегистрированное приложение и успешно вернет вам Request Token.

Если вы используете метод HMAC-SHA1, Consumer Secret и Token Secret будут использоваться для подписания ваших запросов. Эти два секретных параметра известны как вашему приложению, так и Google, и действуют как секретный ключ в алгоритме симметричного шифрования.

Однако, чтобы использовать метод RSA-SHA1, вы уже должны были загрузить Public Key на сервер (сервер Google) во время процесса регистрации вашего приложения. После этого вы будете использовать Private Key для подписи ваших запросов OAuth. В вашем случае, поскольку вы не зарегистрировали свое приложение, Google не знает о вашем Public Key, и поэтому использование RSA-SHA1 метода для подписания ваших запросов с неизвестным Private Key бесполезно.

Первый метод обычно предпочтительнее, чем RSA-SHA1, из соображений производительности. (симметричное шифрование быстрее, чем асимметричное)

Вот так я мог успешно получить Request Token на OAuth Playground :

  1. Установите 'oauth_consumer_key' на anonymous (если у вас нет зарегистрировали ваше приложение и получили реальную Consumer Key)
  2. Установите для «секрета пользователя» значение anonymous (если вы не зарегистрировали свой приложение и реально Consumer Secret)
  3. Выберите https://www.google.com/analytics/feeds/ в качестве объема запроса.
  4. Нажмите кнопку «Запросить токен»

Результат:

GET /accounts/OAuthGetRequestToken?scope=https%3A%2F%2Fwww.google.com%2Fanalytics%2Ffeeds%2F HTTP/1.1
Host: www.google.com
Accept: */*
Authorization: OAuth oauth_version="1.0", oauth_nonce="116d4df85e784f51cf40f0bc3a967883", oauth_timestamp="1322083727", oauth_consumer_key="anonymous", oauth_callback="http%3A%2F%2Fwww.googlecodesamples.com%2Foauth_playground%2Findex.php", oauth_signature_method="HMAC-SHA1", oauth_signature="vVxpbtHlTR%2BJ1yT%2BYS1HOvRzhOs%3D"

HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Date: Wed, 23 Nov 2011 21:28:47 GMT
Expires: Wed, 23 Nov 2011 21:28:47 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Length: 118
Server: GSE

oauth_token=4%2F7E_YtZFHuKFPbuAGuCzyj2AsHcha&oauth_token_secret=NHZBJCj2BPxR2HQZhCTwdq2A&oauth_callback_confirmed=true

Теперь, когда вы приобрели oauth_token и oauth_token_secret, вы можете нажать кнопку Авторизовать. Это перенаправит вас на страницу входа в Google (если вы не вошли в систему), а затем на страницу, на которой вы предоставляете доступ к приложению. Предоставив доступ, вы вернетесь к callback url на детской площадке с verifier code. Нажав кнопку «Токен доступа», вы получите access token:

GET /accounts/OAuthGetAccessToken HTTP/1.1
Host: www.google.com
Accept: */*
Authorization: OAuth oauth_version="1.0", oauth_nonce="c222a88cc9f027430b239f4cc6f3f154", oauth_timestamp="1322084080", oauth_consumer_key="anonymous", oauth_verifier="TA6vWcDJC51A9YwMNfmUzmUQ", oauth_token="4%2F7E_YtZFHuKFPbuAGuCzyj2AsHcha", oauth_signature_method="HMAC-SHA1", oauth_signature="q9M%2BjeHNxB2ONPd1DPMn6GriUC8%3D"

HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Date: Wed, 23 Nov 2011 21:34:40 GMT
Expires: Wed, 23 Nov 2011 21:34:40 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Length: 103
Server: GSE

oauth_token=1%2Fxy49iwSQEcqSDbo3cKO-UuPLqvt9qKFit9vaLqR6P-M&oauth_token_secret=IJWB1CVSQfYJJPrf9jXv6SS8

* Примечание : Однажды я тоже получил ответ signature_invalid, хотя я ввел анонимные учетные данные. Но после повторной попытки и нажатия кнопки «Запрос токена» один или два раза я сделал это. Я думаю, это должно быть связано с тем, как параметры nonce и timestamp работают для подписания запроса. Это может быть причиной проблемы. Прочитайте эту статью для получения дополнительной информации.

Дополнительная информация:

2 голосов
/ 24 ноября 2011

Гуглер здесь.Давно не отвечал на вопросы OAuth 1, потому что все переходят на OAuth 2 (и вы тоже должны), но я постараюсь просмотреть обычных подозреваемых на ошибки недопустимой подписи:

  • Ваш серверчасы могут быть неправильными.Есть компонент отметки времени, и он должен очень близко соответствовать нашему.Попробуйте обновить ваши часы на одном из основных серверов времени.Это случается, но это редкая проблема.
  • В зависимости от того, насколько низкоуровневым является клиент OAuth, который вы используете, вы, возможно, забыли предоставить часть ключа, используемого для генерации подписи.Ключ состоит из двух частей, разделенных двоеточием, IIRC.В некоторых частях протокола требуется только одна половина, но для других частей протокола вам нужны оба.Я видел случаи, когда кто-то поставлял только первую половину, когда оба были необходимы.На самом деле, я думаю, что сам совершил эту ошибку пару раз.
  • Вероятно, это не проблема в вашем случае, потому что вы даже не прошли токен запроса, но OAuth 1 требует, чтобы вы подписали параметры запроса URI,Невыполнение этого требования приведет к несовпадению базовых строк подписи, что приведет к тому, что подпись будет недействительной.
  • Наиболее распространенной проблемой является неправильное кодирование.Обычно это выражается в виде сигнатур, которые иногда работают, но иногда терпят неудачу, потому что иногда вам везет, и ничего не нужно кодировать.Я подозреваю, что это то, с чем @Meysam столкнулся на основании своего комментария, что он нажал кнопку еще несколько раз, и вдруг это сработало.

Кстати, если вам нужно использовать OAuth 1, вам следуетиспользовать HMAC-SHA1, если у вас нет действительно веской причины сделать RSA-SHA1.

...