如何在 Java 中使用刷新令牌获取访问令牌?

San*_*osh 2 java google-contacts-api access-token refresh-token

我目前正在实施Contact Applicationusing Google Contact APIin Java。我已完成授权步骤并获得访问令牌刷新令牌

现在我有了CLIENT_ID , CLIENT_SECRET AND REFRESH_TOKEN。但是访问令牌将在一个小时内过期。

有人可以告诉如何在 Java 中使用刷新令牌自动生成访问令牌吗?

小智 5

您可以使用 Google OAuth2 客户端库通过刷新令牌获取新的访问令牌

这是我获取新访问令牌的代码:

public TokenResponse refreshAccessToken(String refreshToken) throws IOException {
    TokenResponse response = new GoogleRefreshTokenRequest(
            new NetHttpTransport(),
            new JacksonFactory(),
            refreshToken, 
            "your clientId",
            "your clientSecret")
            .execute();
    System.out.println("Access token: " + response.getAccessToken());

    return response;
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读官方 Google API 指南:


Dev*_*Dev 1

我通过两种方式实现了这个场景。不确定它们是不是最好的,但对我来说效果很好。

在这两种情况下,您都必须存储刷新令牌以及用户的电子邮件 ID 。然后您必须按照以下格式发出 HTTP 请求。

POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=**<your_client_id>**&
client_secret=**<your_client_secret>**&
refresh_token=**<refresh_token>**&
grant_type=refresh_token
Run Code Online (Sandbox Code Playgroud)

它将返回access_tokenexpires_in

现在的问题是如何以及何时进行http请求。为此我有两种方法。

第一个

存储 emailid、刷新令牌、访问令牌和当前时间+3600 秒。在数据库中,您可以安排每 5 分钟检查一次过期时间,如果任何用户的当前时间将达到(5 或 10 分钟之前)过期时间,则获取刷新令牌并更新该特定用户的值。在 api 调用期间,只需获取用户的访问令牌。

第二个

当用户登录您的站点时,获取访问令牌和当前时间+ 3600 秒并将其存储在浏览器 cookie 中。现在,在执行任何 api 调用之前,只需检查当前时间(api 调用完成的时间)是否小于过期时间(存储在 cookie 中)。如果为真,那么您可以使用之前的访问令牌,否则获取一个新的访问令牌并再次更新 cookie。此外,您还必须提出另一个条件,即如果 cookie 根本不存在,那么您还必须获取新的刷新令牌。