Google API oauth invalid_grant

Google API oauth invalid_grant

我的应用程序中存在刷新令牌问题,我不知道如何解决它。我已经看到了各种关于它的 post,但我仍然需要一些帮助。我使用的授权码基本上是快速入门的。

private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final String TOKENS_DIRECTORY_PATH = "tokens";

protected final Credential authorize(final List<String> SCOPES) throws IOException, GeneralSecurityException {
    final InputStream in = GoogleAPI.class.getResourceAsStream("/credentials.json");
    final GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
    final GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow
            .Builder(GoogleNetHttpTransport.newTrustedTransport(), JSON_FACTORY, clientSecrets, SCOPES)
            .setDataStoreFactory(new FileDataStoreFactory(new File(TOKENS_DIRECTORY_PATH)))
            .setAccessType("offline")
            .build();
    final LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(9000).build();
    return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}

直到那天 google 开始使用 HTTP 400 Bad Request 响应以下消息

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

我检查了这个 post Google OAuth “invalid_grant” nightmare — and how to fix it,我尝试删除凭证并创建一个新凭证。我也试过在本地删除令牌,但没有成功。

我在这里错过了什么?

Token has been expired or revoked

可能是由于您正在离线使用和请求刷新令牌这一事实引起的。

您的应用程序使用刷新令牌在访问令牌过期时请求新的访问令牌。

您似乎将“用户”的凭据存储在 TOKENS_DIRECTORY_PATH 中,如果您想去看看那里应该有一个包含“用户”凭据的文件。

在该文件中您应该找到一个刷新令牌,您的错误消息表明它已过期或已被撤销。

如果用户转到 Google 他们的 Google profile 他们可以撤销您的应用程序访问权限。这会导致错误消息。

另一种可能是您请求了很多刷新令牌。当您的应用程序运行并且用户授权您的应用程序时,您将获得一个刷新令牌,如果他们再次这样做,您将获得另一个刷新令牌,两者都可以使用。从技术上讲,google 可以为您生成并 return 最多 50 个刷新令牌,它们都可以工作。如何在 50 google 之后过期最旧的。

因此您需要确保始终为用户使用最新的刷新令牌,而不是 运行 旧令牌。