Java Google API oauth无效\u授权

Java Google API oauth无效\u授权,java,google-api,google-oauth,google-api-java-client,Java,Google Api,Google Oauth,Google Api Java Client,我的应用程序中有一个刷新令牌问题,我不知道如何解决它。我看过很多关于它的帖子,但我仍然需要一些帮助。我使用的授权码基本上是快速启动码 private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); private static final String TOKENS_DIRECTORY_PATH = "tokens"; protected final Credentia

我的应用程序中有一个刷新令牌问题,我不知道如何解决它。我看过很多关于它的帖子,但我仍然需要一些帮助。我使用的授权码基本上是快速启动码

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");
}
private static final JsonFactory JSON_FACTORY=JacksonFactory.getDefaultInstance();
私有静态最终字符串令牌\u目录\u路径=“令牌”;
受保护的最终凭据授权(最终列表作用域)引发IOException、GeneralSecurityException{
final InputStream in=GoogleAPI.class.getResourceAsStream(“/credentials.json”);
final GoogleClientSecrets clientSecrets=GoogleClientSecrets.load(JSON_工厂,新的InputStreamReader(in));
最终GoogleAuthorizationCodeFlow=新的GoogleAuthorizationCodeFlow
.Builder(GoogleNetHttpTransport.newTrustedTransport(),JSON_工厂,客户端机密,作用域)
.setDataStoreFactory(新文件DataStoreFactory(新文件(令牌目录路径)))
.setAccessType(“脱机”)
.build();
最终LocalServerReceiver=新的LocalServerReceiver.Builder().setPort(9000.build();
返回新的AuthorizationCodeInstalledApp(流程、接收方)。授权(“用户”);
}
直到谷歌开始响应HTTP 400错误请求的那一天,上面的操作一直正常,并显示以下消息

{ “错误”:“无效的授权”, “错误描述”:“令牌已过期或吊销。” }

我浏览了这篇文章,尝试删除凭证并创建一个新凭证。我还尝试在本地删除令牌,但没有成功

我错过了什么

令牌已过期或被吊销

可能是由以下几件事引起的:您正在脱机使用并请求刷新令牌

当访问令牌过期时,应用程序使用刷新令牌请求新的访问令牌

您似乎正在令牌目录路径中存储“用户”的凭据。如果您想查看,应该有一个包含“用户”凭据的文件

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

如果用户转到谷歌,他们可以撤销你的应用程序访问权。这将导致错误消息

另一种可能是您已请求刷新许多令牌。当您的应用程序运行并且用户授权您的应用程序时,您将获得一个刷新令牌,如果他们再次这样做,您将获得另一个刷新令牌,这两个令牌都将工作。从技术上讲,谷歌可以生成并返回给你多达50个刷新令牌,它们都可以工作。谷歌将如何在50年后终止最老的一个

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