Google Data Api 返回无效的访问令牌

Posted

技术标签:

【中文标题】Google Data Api 返回无效的访问令牌【英文标题】:Google Data Api returning an invalid access token 【发布时间】:2012-04-15 10:12:05 【问题描述】:

我正在尝试从 Google 帐户中提取联系人列表。但谷歌返回 401。

请求授权码的url:

String codeUrl = 'https://accounts.google.com/o/oauth2/auth' + '?'
           + 'client_id=' + EncodingUtil.urlEncode(CLIENT_ID, 'UTF-8')
           + '&redirect_uri=' + EncodingUtil.urlEncode(MY_URL, 'UTF-8')
           + '&scope=' + EncodingUtil.urlEncode('https://www.google.com/m8/feeds/', 'UTF-8')
           + '&access_type=' + 'offline'
           + '&response_type=' + EncodingUtil.urlEncode('code', 'UTF-8')
           + '&approval_prompt=' + EncodingUtil.urlEncode('force', 'UTF-8');

用返回的授权码交换访问令牌(和刷新令牌):

String params = 'code=' + EncodingUtil.urlEncode(authCode, 'UTF-8')
              + '&client_id=' + EncodingUtil.urlEncode(CLIENT_ID, 'UTF-8')
              + '&client_secret=' + EncodingUtil.urlEncode(CLIENT_SECRET, 'UTF-8')
              + '&redirect_uri=' + EncodingUtil.urlEncode(MY_URL, 'UTF-8')      
              + '&grant_type=' + EncodingUtil.urlEncode('authorization_code', 'UTF-8');  

Http con = new Http();
Httprequest req = new Httprequest();
req.setEndpoint('https://accounts.google.com/o/oauth2/token');
req.setHeader('Content-Type', 'application/x-www-form-urlencoded');                   
req.setBody(params);
req.setMethod('POST');
Httpresponse reply = con.send(req); 

它返回一个带有有效访问令牌的 JSON 数组:

 
    "access_token" : "access_token", 
    "token_type" : "Bearer", 
    "expires_in" : 3600, 
    "refresh_token" : "refresh_token" 
 

但是,当我尝试使用访问令牌(在代码或 curl 中)时,Google 会返回 401:

curl -H "Authorization: Bearer access_token"  https://www.google.com/m8/feeds/contacts/default/full/

顺便说一句,相同的 curl 命令,但通过https://code.google.com/oauthplayground/ 获得了访问令牌。这使我相信交换访问令牌请求的授权代码有问题,因为返回的访问令牌不起作用。

我应该添加这一切都在 expires_in 时间范围内,所以不是 access_token 已过期

【问题讨论】:

【参考方案1】:

好的,所以问题出在请求授权码时的范围内。我不小心将范围设置为https://www.google.com/m8/feeds/contacts/default/full(用于检索所有联系人的 url),这是深夜编码的危险。具有讽刺意味的是,问题中的示例使用了正确的硬编码 url,它没有错误。我会留下这个问题,希望那些有类似问题的人能找到它并且问题中的代码有效。

【讨论】:

以上是关于Google Data Api 返回无效的访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

Google Analytics:从刷新令牌中获取访问令牌

使用记录范围时,Google 保留 API 以无效范围响应

如何从 Google YouTube Data API OAuth 2 iOS 获取刷新令牌

通过Google云端硬盘访问Google相册无效

用于向 Google API (Swift) 验证服务帐户的 JWT 签名无效

Zoom api 问题 - 无效的访问令牌 - JWT