【问题标题】:GoogleCredential OAuth access token invalid_grant errorGoogleCredential OAuth 访问令牌 invalid_grant 错误
【发布时间】:2015-07-24 20:54:06
【问题描述】:

我正在尝试通过服务帐户为 google 的存储 api 获取 2 腿 oauth2 访问令牌。

相关文档包含在此处: https://developers.google.com/identity/protocols/OAuth2ServiceAccount

我首先尝试通过他们的 HTTP/REST api 获取令牌。我最终放弃了无法通过以下详细信息的 400 响应:

{ "错误" : "invalid_grant" }

然后我转向推荐的方法:使用 java Google api 客户端库(我正在使用 scala)。

val credentialBuilder = new GoogleCredential.Builder()
  .setTransport(GoogleNetHttpTransport.newTrustedTransport())
  .setJsonFactory(JacksonFactory.getDefaultInstance())
  .setServiceAccountId(Configuration.GoogleAPI.ServiceAccount.email)
  .setServiceAccountPrivateKeyFromP12File(new File(Configuration.GoogleAPI.ServiceAccount.pkcs12))
  .setServiceAccountScopes(Collections.singleton(StorageScopes.DEVSTORAGE_FULL_CONTROL))

def updateToken = {
  val credential = credentialBuilder.build()
  credential.refreshToken()
  // ... do stuff here with token
}

运行上述程序,我得到一个 TokenResponseException,其有效负载与我直接访问 REST api 时遇到的错误相同。 400 错误请求,invalid_grant 错误。

做一些研究(在 stackoverflow 和其他地方),我发现这个错误消息的最常见原因是:

1) 本地时钟未与 Google 的服务器同步。当我使用 REST api 时,我什至怀疑这一点,因为我以前在其他服务中遇到过这个问题。不过,我很确定这不是时钟问题,因为我反复将时钟与外部 ntp 服务器同步:

sudo ntpdate -s ntp.ubuntu.com

2) 导致此错误的另一个常见原因是服务帐户客户端 ID 设置不正确。大多数人将其设置为他们的服务帐户客户 ID(以“apps.googleusercontent.com”结尾)而不是他们的服务帐户客户电子邮件。很明显这不是问题,因为我正确指向了电子邮件(文档指示了这一点,所以我按照说明进行操作),以“@developer.gserviceaccount.com”结尾。

我被困住了。我检查了用户文档、javadocs、各种论坛。错误消息不是很有帮助(可能是这样设计的,因为它是一个安全端点)。

还有哪些其他可能导致此错误的原因?如何获取我的服务帐号访问令牌?

【问题讨论】:

  • 我遇到了同样的问题。你有想过这个吗?

标签: google-oauth google-api-java-client


【解决方案1】:

如果您使用 OAuth2.0 访问 google 分析帐户,那么可能还有另一个原因导致 invalid_grant。根据developer docs

如果应用程序尝试使用无效的刷新令牌,则 返回 invalid_grant 错误响应。每个唯一的限制 对 OAuth 2.0 客户端和 Google Analytics 帐户是 25 刷新 令牌(请注意,此限制可能会更改)。如果申请 继续为同一客户/帐户对请求刷新令牌, 一旦第 26 个令牌发出,第一个刷新令牌 以前发出的将失效。第 27 次请求刷新 令牌将使之前发布的第二个令牌失效,依此类推。

【讨论】:

  • 这似乎不是问题。我没有使用分析服务(尽管这可能也适用于其他 API)。我什至没有成功获得一次访问令牌,更不用说刷新现有令牌了。没有其他人正在使用此服务帐户。如果这是一个问题,我可以在等待一个小时让旧令牌过期后获得一个令牌。即使超过一个小时没有尝试获得令牌,我也无法获得令牌。
猜你喜欢
  • 1970-01-01
  • 2015-09-04
  • 2015-05-16
  • 2015-05-30
  • 2019-11-09
  • 2020-12-07
  • 1970-01-01
  • 2016-03-05
  • 2018-11-03
相关资源
最近更新 更多