2014-01-12 2 views
0

В настоящее время я следую инструкциям, указанному here, для проверки перекрестного клиента в приложении Android-GAE, поэтому мои пользователи могут предоставить автономный доступ к API G + для Python без их использования. Эта документация также направляет мне here, и это действительно то, с чем я столкнулся. Я успешно получил код авторизации и отправил его на бэкэнд, но когда бэкэнд пытается обменять этот код для доступа и обновления токенов, я получаю «error: invalid_grant» с «описанием ошибки: неверный код». Чтобы проиллюстрировать это, когда я скопировать код и другую необходимую информацию в завиток, выход следующим образом:grant_error недействительный код в android-GAE

curl -d "code=4/uG6moqbHvs9hgfG1HmEfT39zT1j0.Un-H_36OXGUWmmS0T3UFEsMwQpwOhwI&client_secret={MY_SECRET}&client_id={MY_WEB_CLIENT_ID}&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token -v 
* Adding handle: conn: 0x7fc359803a00 
* Adding handle: send: 0 
* Adding handle: recv: 0 
* Curl_addHandleToPipeline: length: 1 
* - Conn 0 (0x7fc359803a00) send_pipe: 1, recv_pipe: 0 
* About to connect() to accounts.google.com port 443 (#0) 
* Trying 74.125.28.84... 
* Connected to accounts.google.com (74.125.28.84) port 443 (#0) 
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_RC4_128_SHA 
* Server certificate: accounts.google.com 
* Server certificate: Google Internet Authority G2 
* Server certificate: GeoTrust Global CA 
* Server certificate: Equifax Secure Certificate Authority 
> POST /o/oauth2/token HTTP/1.1 
> User-Agent: curl/7.30.0 
> Host: accounts.google.com 
> Accept: */* 
> Content-Length: 219 
> Content-Type: application/x-www-form-urlencoded 
> 
* upload completely sent off: 219 out of 219 bytes 
< HTTP/1.1 400 Bad Request 
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
< Pragma: no-cache 
< Expires: Fri, 01 Jan 1990 00:00:00 GMT 
< Date: Sun, 12 Jan 2014 16:38:42 GMT 
< Content-Type: application/json 
< X-Content-Type-Options: nosniff 
< X-Frame-Options: SAMEORIGIN 
< X-XSS-Protection: 1; mode=block 
* Server GSE is not blacklisted 
< Server: GSE 
< Alternate-Protocol: 443:quic 
< Transfer-Encoding: chunked 
< 
{ 
    "error" : "invalid_grant", 
    "error_description" : "Invalid code.[Email: \n\nToken Record:\nToken: \"4/uG6moqbHvs9hgfG1HmEfT39zT1j0.Un-H_36OXGUWmmS0T3UFEsMwQpwOhwI\"\nIssueDomain: \"206701529154-7d35h3g4a22aef8d78p6up1cdiq3pl4d.apps.googleusercontent.com\"\nIssueTimeSec: 1389544361\nExpirationTime: 1389544961\nTokenUsage: 3\nScope: \"https://www.googleapis.com/auth/plus.login\"\nScope: \"https://www.googleapis.com/auth/userinfo.profile\"\nScope: \"https://www.googleapis.com/auth/userinfo.email\"\nScope: \"https://www.googleapis.com/auth/plus.moments.write\"\nScope: \"https://www.googleapis.com/auth/plus.me\"\nScope: \"https://www.googleapis.com/auth/plus.profile.agerange.read\"\nScope: \"https://www.googleapis.com/auth/plus.profile.language.read\"\nScope: \"https://www.googleapis.com/auth/plus.circles.members.read\"\nServiceInfo {\n ServiceId: 226\n Info <\n [security_lso_auth_oauth2.EarlyIssuedTokenProto] <\n  auto_approved: false\n  access_token: \"ya29.1.AADtN_UyJ2wiWB7lh7btUiCwUyHzix_DrubjdSsTxA6drG-ZccPWaeZJa31sebPnRCHiFw\"\n  refresh_token: \"1/ImSjHYLkFcBOwsCezBg2dKpcqko9by3nTIh_k33ZMds\"\n >\n >\n}\nRevoked: true\nAuthorizedBy: 0x866419b291\nOAuthCallbackUrl: \"urn:accounts.google.com:api_auth:programmatic:virtual_redirect_uri\"\nOfflineAccess: true\nRevokeOnPasswordChange: true\nClientManagedRevocation: false\nInBundle: true\n]" 
* Connection #0 to host accounts.google.com left intact 
}% 

У меня много проблем делают смысл этого сообщения об ошибке, чтобы определить, почему мой код авторизации может быть недействительным. Я заметил, что в журналах проводника все журналы имеют отметки времени в час в прошлом (поэтому, когда я отправляю журнал в 11 утра, он появляется в проводнике с отметкой времени 10AM). Может ли расхождение в часовом поясе каким-то образом заставлять серверы oauth2 думать, что я отправляю коды авторизации, которые являются слишком старыми? Я уже пытался изменить свое системное время, чтобы соответствовать времени журнала, но безрезультатно. Кто-нибудь знает, что может привести к тому, что мой код авторизации будет недействительным? Я искал высоко и низко в течение нескольких часов.

ответ

2

Вскоре после отправки этого вопроса я сам обнаружил ответ. Отправьте его здесь, если другие столкнутся с той же проблемой. Я заметил, что аналогичная ошибка произошла в Google API Invalid grant on one-time auth code from GoogleAuthUtil.getToken, и причина заключалась в том, что разработчику необходимо было запросить токены обновления/доступа несколько раз в течение 10 минут (что является длительностью срока действия одноразового кода авторизации). Проверяя, что мои проводники журнала снова регистрируются, я увидел, что у меня есть ошибка в коде Android, в результате чего код проверки межпроцессорности выполняется дважды в быстрой последовательности, а не только один раз, как предполагалось. При первом запуске маркеры обновления и доступа возвращаются правильно. Во второй раз генерируется ошибка.

В ретроспективе часть «revoked = True» сообщения об ошибке должна указывать на ответ.

+0

, но что, если в сценарии я хочу получить токен в быстрой последовательности? И у меня есть invalidatd сгенерированный токен, используя GoogleAuthUtil.invalidateToken (это, код); вручную. то тоже я получаю ту же ошибку. – chaitanyad

Смежные вопросы