【问题标题】:Invalid grant when accessing Google API访问 Google API 时授权无效
【发布时间】:2013-04-06 18:28:35
【问题描述】:

我正在尝试使用“服务帐户”授权访问来调用任何 Google API。我已下载“.pk2”文件并在 Google API 控制台的“服务”选项卡中激活“URL Shortener API”。每当我尝试调用任何 API(URL 缩短器或 Adsense)时。我有以下异常 -

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "invalid_grant"
}
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:303)
    at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:323)
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:345)
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:526)
    at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:287)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:836)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:412)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:345)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:463)

下面是代码sn-p -

    HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
    JsonFactory JSON_FACTORY = new JacksonFactory();
    File privateKey = new File(ReportAdsense.class.getResource("mykey.p12").toURI());
    GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId("my_valid_account_id@developer.gserviceaccount.com")
            .setServiceAccountScopes(UrlshortenerScopes.URLSHORTENER)
            .setServiceAccountPrivateKeyFromP12File(privateKey)
            .build();
     Urlshortener service = new Urlshortener.Builder(new NetHttpTransport(), JSON_FACTORY, null).setHttpRequestInitializer(credential).build();
     UrlHistory history = service.url().list().execute();

【问题讨论】:

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


    【解决方案1】:

    首先,“服务帐户”不适用于 Adsense,因为它需要用户授权。因此,对于 Adsense,您应该使用 Oauth 2.0。当您第一次使用 URL https://accounts.google.com/o/oauth2/token 获得授权时,复制粘贴并硬编码您的刷新令牌。您可以使用它来获取访问令牌,指定 client_id、client_secret 和您的 refresh_token 来获取新的访问令牌。现在可以在您的应用程序中使用访问令牌。

    关于您的错误,我遇到了类似的问题,并花了很多时间来解决它。首先,确保您使用的是有效的 ServiceAccountId - 它应该指向以“developer.gserviceaccount.com”结尾的电子邮件。确保您在 Google Console API 中指定了帐户范围和激活的服务。

    我通过在我的机器上同步系统时钟解决了这个问题。

    有很多类似错误的主题没有答案。甚至有人说,有时它有效,有时它返回无效授权。它可以在一台机器上工作而在另一台机器上失败。我不知道这是否是系统时钟问题,但我会避免使用服务帐户 API,因为看起来有错误并且支持对您没有帮助

    【讨论】:

    • “我解决了这个问题,通过在我的机器上同步系统时钟。”仅此评论就为我节省了大量时间,试图在针对 Google Drive 进行测试时找出 DigitalOcean VM 上的问题。使用rackspace.com/knowledge_center/article/using-ntp-to-sync-time 处的说明更正了系统时钟,问题已得到解决。谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多