尝试从服务帐户获取访问令牌时出错

时间:2014-07-17 11:35:42

标签: google-bigquery

INFO: com.google.api.client.auth.oauth2.TokenResponseException: 400 OK
{
  "error" : "invalid_grant"
}

我的代码是

GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(js)
            .setServiceAccountId(emailId)
            .setServiceAccountScopes(scopes)
            .setServiceAccountPrivateKeyFromP12File(new File(privateKeyPath)).build();

    System.out.println("SERVICE ACCOUNT SERVLET CALLED");

    credential.refreshToken();

此方法运行正常但突然开始出错。

1 个答案:

答案 0 :(得分:3)

可能的原因:

1)由于服务器上的时间不正确,我遇到了类似的问题。确保您的系统时钟已同步。

2)您应该重用第一次成功验证后获得的访问令牌。如果您之前的令牌尚未过期,您将收到invalid_grant错误。将其缓存在某处,以便您可以重复使用它。

3)确保您传递了访问令牌,而不是因为失败而刷新令牌。当您运行时,它会将OAUth2刷新令牌转换为访问令牌并将其传递给服务。如果您传递原始刷新令牌,则不接受API访问,而不将其转换为短期访问令牌。

4)您可能已达到刷新令牌限制。某些Google API有此功能,您可以在此处找到一些解释:https://developers.google.com/compute/docs/authentication

5)你也可以撤销它。转到您的Google API控制台(https://code.google.com/apis/console/)并在客户端ID下撤消已安装应用程序的客户端密钥。请务必使用新的客户端密钥

更新您的代码