Java Google云存储和服务帐户出现无效的\u授权错误

Java Google云存储和服务帐户出现无效的\u授权错误,java,oauth-2.0,google-cloud-storage,Java,Oauth 2.0,Google Cloud Storage,当我尝试使用服务帐户访问Google云存储API时,我收到一个无效的_grant错误。我无法找出以下代码的错误。有什么想法吗?这是我第一个使用谷歌存储API的应用程序。任何帮助都将不胜感激 源代码 public static void main(String[] args) throws Exception { HttpTransport httpTransport = new NetHttpTransport(); JsonFactory jsonFactory = new J

当我尝试使用服务帐户访问Google云存储API时,我收到一个无效的_grant错误。我无法找出以下代码的错误。有什么想法吗?这是我第一个使用谷歌存储API的应用程序。任何帮助都将不胜感激

源代码

public static void main(String[] args) throws Exception {
    HttpTransport httpTransport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();

    List<String> scopes = new ArrayList<String>();
    scopes.add(StorageScopes.DEVSTORAGE_FULL_CONTROL);

    Credential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(jsonFactory)
            .setServiceAccountId("XXXX")
            .setServiceAccountPrivateKeyFromP12File(new File("key.p12"))
            .setServiceAccountScopes(scopes).build();

    Storage storage = new Storage.Builder(httpTransport, jsonFactory,
            credential).setApplicationName("test")
            .build();

    List<String> list = new ArrayList<String>();
    List<Bucket> buckets = storage.buckets().list("XXXX").execute().getItems();
    if(buckets != null) {
        for(Bucket b : buckets) {
            list.add(b.getName());
        }
    }
}
Exception in thread "main" 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:287)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:269)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:217)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:858)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
at GoogleStorageFetcher.main(GoogleStorageFetcher.java:143)

此错误是由于服务帐户ID不正确造成的。我使用的是客户端ID(以.apps.googleusercontent.com结尾)而不是电子邮件地址(以@developer.gserviceaccount.com结尾)。电子邮件地址没有问题。

我知道这个问题是一年前提出的

我有以下错误:错误:“无效的授权”,描述:,Uri:

在我的例子中,问题解决了,将服务器时钟与NTP同步。我的服务器的防火墙阻止了一个端口,服务器的时间没有正确更新


有关更多信息,请访问“管理API-授权”帮助页面上的部分(相对于Google Analytics,但与错误相关)

Hrm…我没有发现任何错误。您的服务帐户看起来像一个以“@developer.gserviceaccount.com”结尾的长电子邮件地址,对吗?“key.p12”是在正确的地方打开的吗?可能值得尝试命令行示例应用程序以确保您的凭据有效:谢谢。实际上,我使用的是客户端ID(以.apps.googleusercontent.com结尾)而不是电子邮件地址(以@developer.gserviceaccount.com结尾)。当我的计算机的时间与现实不同步时,我也遇到了同样的问题。谷歌认证给出了这个错误。你们是如何修复同步的??我的机器在/etc/ntp.conf上已经有了ubuntu的时区。这意味着我的问题可能与此无关?谷歌免费提供NTP服务器:我犯了同样的错误。谢谢分享!您知道@iam.gserviceaccount.com是否也是有效的电子邮件地址吗?当我创建一个服务帐户时,它总是给我一个格式为的电子邮件地址。