google oauth2 id_token vs refresh_token

时间:2014-09-26 11:17:05

标签: python oauth-2.0 google-contacts jwt

我尝试使用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 当我尝试添加到params 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

1 个答案:

答案 0 :(得分:0)

如果您需要刷新令牌,最好将access_type = offline和approval_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

的握手中为您提供刷新代码