google oauth2 id_token против refresh_token

Я пытаюсь использовать Google OAuth2 для получения контактной информации пользователя. Я не борюсь с получением доступа, мне интересно, что по какой-то причине я перестал получать refresh_token, вместо этого я получаю id_token (длинная строка JWT). Я использую python urllib для получения информации о доступе для пользователей. Мой код:

scope = 'https://accounts.google.com/o/oauth2/token'
params = urllib.urlencode({
    'code': request.GET['code'],
    'redirect_uri': settings.SOCIAL_AUTH_GOOGLE_REDIRECT_URI,
    'client_id': settings.SOCIAL_AUTH_GOOGLE_OAUTH2_KEY,
    'client_secret': settings.SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET,
    'grant_type': 'authorization_code',
})

Ответ:

{u'access_token': u'hash',
 u'token_type': u'Bearer', 
 u'expires_in': 3600,
 u'id_token': u'really long hash'}

Я использую область контактов https://www.google.com/m8/feeds/contacts/default/full?alt=json Когда я пытаюсь добавить в параметры access_type : offline, я получаю сообщение об ошибке ниже:

Failed to retrive access_token. Status: 400
Message: {
  "error" : "invalid_request",
  "error_description" : "Parameter not allowed for this message type: access_type"
}

Итак, после этого я задаюсь вопросом:

  1. Могу ли я использовать id_token для обновления моего access_token ?
  2. Если сначала True: Как?
  3. Существуют ли какие-либо различия между типами пользователей, которые проходят аутентификацию, потому что я заметил, что иногда вы получаете refresh_token, но мне нужно получить его постоянно, в следующий раз, когда я создам поток OAuth2, я получу id_token

person izdi    schedule 26.09.2014    source источник


Ответы (1)


Если вам нужен токен обновления, вам лучше добавить access_type=offline и author_prompt=force на https://accounts.google.com/o/oauth2/auth?.

var url = 'https://accounts.google.com/o/oauth2/auth?' +
          'client_id=' + CLIENT_ID + '&' +
          'response_type=code&access_type=offline&approval_prompt=force&' +
          'redirect_uri=' + encodeURIComponent(REDIRECT_URL) +
          '&scope=' + SCOPES;

Тогда возвращенный код всегда будет давать вам код обновления при следующем рукопожатии с https://www.googleapis.com/oauth2/v4/token

person goodhyun    schedule 30.03.2016