在 Google Contacts API 3.0 版上使用 oauth2 检索刷新令牌
Posted
技术标签:
【中文标题】在 Google Contacts API 3.0 版上使用 oauth2 检索刷新令牌【英文标题】:Retrieving refresh token using oauth2 on Google Contacts API version 3.0 【发布时间】:2012-04-22 15:58:16 【问题描述】:我正在使用 oauth2(node.js 和 connect-oauth 库)连接到 google contacts API version 3.0。
这样做,我会得到如下响应:
access_token : "...",
"token_typen": "Bearer",
"expires_in" : 3600,
"id_token": "..."
我缺少用于在后者过期后立即获取新访问令牌的刷新令牌。
oauth2 的选项
host: 'accounts.google.com',
port: 443,
path: '/o/oauth2/token',
method: 'POST',
headers:
'Content-Type': 'application/x-www-form-urlencoded',
Host: 'accounts.google.com',
'Content-Length': 247
后正文 'redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&grant_type=authorization_code&client_id=CLIENTID&client_secret=CLIENTSECRET&type=web_server&code=4%2F3gbiESZTEOjiyFPLUhKfE_a_jr8Q'
注意:我尝试将approval_prompt=force 从similar question 添加到request-post_body,但这导致了错误
statusCode: 400, data: '\n "error" : "invalid_request"\n'
【问题讨论】:
【参考方案1】:注意:我尝试将来自类似问题的approval_prompt=force 添加到request-post_body 中,但这导致了错误
当您请求令牌时,您不需要 approval_prompt
参数。 *approval_prompt* 参数用于授权部分。
我缺少刷新令牌...
您不会获得 *refresh_token* 的唯一方法是:
使用Client-side Applications 流;
在授权码请求中包含access_type=online param。
所以,尝试在授权码请求中添加:access_type=offline
。
编辑:
即:
https://accounts.google.com/o/oauth2/auth?client_id=**your_client_id**&scope=https://www.googleapis.com/auth/plus.me&redirect_uri=http://localhost&response_type=code&access_type=offline
如果您收到 400
是因为您添加了无效参数或缺少参数。
祝你好运!
【讨论】:
感谢您的回答。不幸的是,这也不起作用。我收到一个错误: statusCode: 400, data: ' "error" : "invalid_request"' .【参考方案2】:有一次我这样做是为了测试——我已经从应用程序中删除了谷歌授权令牌——所以它试图获取另一个授权令牌,但没有刷新令牌。
因此,请检查您正在测试的应用程序是否未授权用于您正在测试的帐户(这有意义吗?)
【讨论】:
Google 只会给你一次刷新令牌。在初始身份验证之后,您只会获得访问令牌。如果您(或您的用户)通过访问 accounts.google.com/b/0/IssuedAuthSubTokens 并从头开始重新启动身份验证序列来删除访问权限,您可以获得新的刷新令牌。以上是关于在 Google Contacts API 3.0 版上使用 oauth2 检索刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章
html Google Contacts API v3 Javascript示例
Google Contacts API - 无法刷新访问令牌
带有 Google JavaScript 客户端库的 Google Contacts API
Google Contacts API v3:如何使用全文查询?