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 之后过期最旧的。
因此您需要确保始终为用户使用最新的刷新令牌,而不是 运行 旧令牌。
我的应用程序中存在刷新令牌问题,我不知道如何解决它。我已经看到了各种关于它的 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 之后过期最旧的。
因此您需要确保始终为用户使用最新的刷新令牌,而不是 运行 旧令牌。