Google+ Вход для серверных приложений, обмен кода авторизации для токена доступа

Я пытаюсь следовать этому потоку для входа пользователя в приложение для Android с помощью серверной части Python:

https://developers.google.com/+/web/signin/server-side-flow

Я успешно получил код авторизации из приложения Android, но когда я пытаюсь обменять этот код на токен доступа с сервера, я получаю ошибку "invalid_request".

Из приложения Android я использую тот же client_id, что и на сервере, который указан в разделе "Идентификатор клиента для веб-приложения" на моей консоли. Я проверил правильность redirect_uri. Разве невозможно сгенерировать код авторизации из клиента Android и использовать сервер для обмена на токен доступа?

Мой код Python:

def auth_params(self):
  client_id, client_secret = self.get_key_and_secret()
  return {
      'grant_type': 'authorization_code',    
      'code': self.data.get('code', ''),  # auth code from app
      'client_id': client_id,
      'client_secret': client_secret,
      'redirect_uri': self.get_redirect_uri()
  }       

@classmethod
def auth_headers(cls):
    return {'Content-Type': 'application/x-www-form-urlencoded',
            'Accept': 'application/json'}

def auth_complete(self, *args, **kwargs):
  params = self.auth_params()
  request = Request('https://accounts.google.com/o/oauth2/token', data=urlencode(params),
                    headers=self.auth_headers())
  try:
      response = simplejson.loads(urlopen(request).read())
  except HTTPError, e:
      print 'fml'

1 ответ

Существует два специальных URI перенаправления, которые фактически не перенаправляют обратно на сервер: "postmessage" и "urn:ietf:wg:oauth:2.0:oob". Эти специальные URI перенаправления не вызывают перенаправление POST на ваш сервер, а вместо этого возвращают токены OAuth 2.0 в ответ на запрос.

Когда вы меняете код на токен доступа и токен обновления, URI перенаправления, связанный с кодом авторизации, должен совпадать.

Поскольку ваш код авторизации поступает с устройства Android, ваш URI перенаправления, вероятно, не соответствует этой строке:

  'redirect_uri': self.get_redirect_uri()

Для обмена кодом Android URI перенаправления должен быть: urn:ietf:wg:oauth:2.0:oob

Надеюсь, это поможет. Как вы, возможно, заметили, если вы также принимаете код авторизации, возвращаемый из веб-входа или Android, вам необходимо соответствующим образом установить URI перенаправления (например, urn [...] для Android, "postmessage" или настроенный перенаправить в противном случае).

Другие вопросы по тегам