为什么 oauth 2.0 客户端 ID 会自动过期?

问题描述

执行计算引擎

api(GET https://compute.googleapis.com/compute/v1/projects/{project}/zones/{zone}/instances/{resourceId}) with oauth 2.0 client id.

我创建了一个 OAuth2.0 客户端 ID,并根据本网站上的步骤获得了 access_token 和 refresh_token。

Obtaining OAuth 2.0 access tokens

Refreshing an access token (offline access)

我可以使用刷新的 access_token 执行 api。

3 天后,再次运行此步骤,

https://developers.google.com/identity/protocols/oauth2/web-server#offline

回复

json
{   "error": "invalid_grant","error_description": "Token has been expired or revoked." }

为什么 refresh_token 过期了?

refresh_token 可用于获取新访问令牌的令牌。刷新令牌在用户撤销访问之前一直有效。同样,如果您在对 Google 授权服务器的初始请求中将 access_type 参数设置为离线,则此字段仅出现在此响应中。

解决方法

有很多事情会导致刷新令牌过期。

  1. 您使用的是 gmail 范围并且用户更改了他们的密码。
  2. 六个月内未使用。
  3. 该用户已撤销您对其 Google 帐户的访问权限。
  4. 如果用户运行您的应用程序,您将获得一个刷新令牌,如果他们再次运行该应用程序,您将获得一个不同的刷新令牌,您最多可以执行 50 次并获得新的刷新令牌,它们将在第 50 次之后全部工作一个会过期。确保您始终保存最重发的刷新令牌。
  5. 您的应用目前正在测试中,尚未设置为发布,也未通过验证过程。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...