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

时间:2012-04-01 13:30:52

标签: java oauth oauth-2.0

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

用于请求授权码的网址:

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}" 
} 

但是,当我尝试使用访问令牌(代码或卷曲)时,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 个答案:

答案 0 :(得分:0)

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

相关问题