访问谷歌API时授予无效(Invalid grant when accessing Google A

2019-08-23 00:46发布

我试图调用任何使用“服务帐户”授权访问谷歌的API。 我已下载” .pk2" 文件,并在谷歌API控制台的服务选项卡激活‘URL缩短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)

下面是代码片段 -

    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();

Answer 1:

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

关于你的错误,我也面临着类似的问题,花了大量的时间来解决它。 首先,请确保您使用的有效ServiceAccountId - 它应该指向电子邮件与“developer.gserviceaccount.com”完成。 确保,您指定的帐户范围和已开通的业务在谷歌API控制台。

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

还有很多类似的错误题目的回答没有。 更有甚者,有些人说,有时它的工作原理,有时它返回invalid补助。 它可以一台机器上工作,并且不能在另一个上。 我不知道这是否是系统时钟的问题,但我会尽量避免使用服务帐户API,因为看起来像有虫子和支持,也不会帮助你



文章来源: Invalid grant when accessing Google API