尝试刷新 googleapis 的访问令牌时出现 invalid_grant 错误
Posted
技术标签:
【中文标题】尝试刷新 googleapis 的访问令牌时出现 invalid_grant 错误【英文标题】:invalid_grant error trying to refresh access token for googleapis 【发布时间】:2021-11-07 12:00:40 【问题描述】:我们将 googleapis 用于我们的网络应用程序,并存储和管理访问令牌和刷新令牌到我们的数据库。 当我们使用刷新令牌刷新用户的访问令牌时,我们很少遇到 GaxiosError: invalid_grant。
现在,我们使用 google api nodejs 客户端 [ https://github.com/googleapis/google-api-nodejs-client ]。 我们为每个用户将访问令牌和刷新令牌存储到我们的数据库中,并且每 6 小时通过以下逻辑更新它们。
import google from 'googleapis';
// create oauth2client for google apis
const oAuth2Client = new google.auth.OAuth2(client_secret, client_id, redirect_uri);
// set current access token and refresh token (==current_tokens)
oAuth2Client.setCredentials(current_tokens);
// refresh access token and refresh token
// new_token contains access_token and refresh_token
const new_token = await oAuth2Client.refreshAccessToken();
// store the new access token and new refresh token to database
...
有谁知道可能导致 GaxiosError: invalid_grant 的原因吗? 我感觉这可能是由于刷新令牌每 6 小时更新一次。
其他信息
生成auth url的设置
const authUrl = oAuth2Client.generateAuthUrl(
access_type: 'offline',
scope: GOOGLE_APIS_SCOPE, // GOOGLE_APIS_SCOPE contains scopes
prompt: 'consent',
);
【问题讨论】:
【参考方案1】:刷新令牌过期的原因有很多,如果我们查看Oauth2 的文档,您将在此处找到它们的列表。
用户已撤消您应用的访问权限。 刷新令牌已有六个月未使用。 用户更改了密码,刷新令牌包含 Gmail 范围。 用户帐户已超过授予(实时)刷新令牌的最大数量。 用户属于具有有效会话控制政策的 Google Cloud Platform 组织。 为外部用户类型配置了 OAuth 同意屏幕且发布状态为“测试”的 Google Cloud Platform 项目颁发了一个在 7 天后到期的刷新令牌。目前最常见的原因是您的应用程序未设置为生产,如果它仍在测试中,那么您的刷新令牌将在一周后过期。
您提到它每六个小时存储在数据库中。我会仔细检查您是否每六个小时刷新一次访问令牌,并且每次您实际上使用最新的刷新令牌更新数据库时它确实返回一个新的刷新令牌,否则您可能会达到“授予的最大数量(实时)刷新令牌”
【讨论】:
感谢您的回复!应用程序已经在生产中。我们使用 oAuth2Client.refreshAccessToken 函数每 6 小时刷新一次访问令牌并将其存储到数据库中。我还确认程序每次刷新都会使用最新的访问和刷新令牌。 基本上,我们是否继续在 googleapis 中为用户使用相同的刷新令牌?换句话说,我们需要更新刷新令牌吗? 在我看来,这取决于客户端库是否会在每个请求中获得一个新的刷新令牌,或者它是否继续使用相同的刷新令牌。我知道 php 客户端库习惯于给您提供相同的客户端库,而 .net 客户端库您往往每次都会获得一个新的客户端库。这意味着我会更新刷新令牌,以防万一它与您当前存储的令牌不同。以上是关于尝试刷新 googleapis 的访问令牌时出现 invalid_grant 错误的主要内容,如果未能解决你的问题,请参考以下文章
无法刷新访问令牌:响应为“unauthorized_client”