Google OAuthGetRequestToken возвращает signal_invalid

Часами пытались получить токен запроса с помощью Google OAuthGetRequestToken, но он всегда возвращает "signature_invalid".

В качестве теста я использую игровую площадку oAuth для успешного запроса токена. Вот результаты:

Основная строка подписи

  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

Я использую Fiddler для отслеживания моих звонков. Он возвращает базовую строку подписи:

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 (которые должны быть разными), базовая строка практически идентична.

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

Обновление от 20 11/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

Обновление от 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.


person M Schenkel    schedule 16.11.2011    source источник
comment
@M Schenkel: Хотя я использую другую библиотеку для oauth, но получаю ту же проблему с Google. Могу получить код подтверждения, но при попытке получить токен доступа выдает ту же ошибку и все еще не знает, что происходит не так.   -  person Umesh Awasthi    schedule 16.11.2011
comment
Я настоятельно рекомендую вместо этого использовать OAuth 2. Гораздо проще в использовании. Никаких подписей.   -  person Bob Aman    schedule 24.11.2011
comment
Поддерживает ли игровая площадка OAuth 2? Кажется, нет; когда вы делаете запросы от него, заголовок oauth_version=1.0. Если нет, будут ли планы в будущем поддерживать его?   -  person M Schenkel    schedule 24.11.2011


Ответы (2)


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

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

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

person Bob Aman    schedule 24.11.2011
comment
Спасибо - я все это переварю и сделаю еще попытки. Недавно я перешел с RSA на HMAC. Что касается часов, я думаю, что они настроены правильно. Я тоже подумал, что это может быть так, и попытался изменить его на час здесь, на час там. Когда я сделал это, он ответил, что время слишком далеко. - person M Schenkel; 24.11.2011
comment
Что касается вашего четвертого комментария, я тоже столкнулся с ситуацией при использовании Playgounrd, когда я ввел всю информацию, но он ответил «Недействительная подпись». Но нажав кнопку еще раз, я получил действительный токен. Площадка неправильно кодирует?? Еще хочу добавить, что у меня в секретном ключе есть знаки плюс (+). Возможно, это может быть причиной - все остальные символы являются простыми цифрами/буквами. Я добавил дополнительную информацию к исходному сообщению. Спасибо за вашу помощь. - person M Schenkel; 24.11.2011
comment
В какой-то момент на игровой площадке были некоторые проблемы с кодировкой, но я думал, что они исправлены. Может регресс. - person Bob Aman; 28.11.2011
comment
Изучаем реализацию oAuth2 сейчас. - person M Schenkel; 28.11.2011
comment
Хотя это и не является фактическим техническим ответом на вопрос, я понимаю, что переход на oAuth2 является настоящим ответом. - person M Schenkel; 29.11.2011
comment
OAuth 2 для этого API немного сложен, потому что я не верю, что он задокументирован. Тем не менее, я почти уверен, что если вы выберете один из наших других API, поддерживающих OAuth 2, наугад, скажем, API Google+, выполните для него инструкции по аутентификации и вместо этого просто используете область Google Analytics, я думаю, что это, вероятно, сработает. Дайте мне знать, если это не так. - person Bob Aman; 29.11.2011
comment
Боб, да, я пытаюсь внедрить oAuth2 с федеративным входом. Я создал еще один поток Stackoverflow с вознаграждением, но не получил ответов: заголовок stackoverflow.com/questions/8333007/ - person M Schenkel; 11.12.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:

  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 для подписи запроса. Это может быть причиной проблемы. Прочтите эту статью для получения дополнительной информации.

Дополнительная литература:

person B Faley    schedule 23.11.2011
comment
@@meysam - большое спасибо за все ваши усилия. Если бы был способ разделить очки, я бы отдал тебе часть награды. К сожалению, ответ гуглера побудил меня перейти на oAuth 2.0. - person M Schenkel; 29.11.2011
comment
@M Schenkel Нет проблем, чувак :) - person B Faley; 29.11.2011