有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Google服务帐户授权错误

我正在尝试将Google API与服务帐户一起使用。 最初,我使用一个具有凭据的普通项目帐户,并设法查询API。要使用服务帐户,我修改了代码以跳过浏览器身份验证流,只使用服务帐户凭据。似乎以前使用普通项目凭据的同一个请求现在给出了一个错误,但消息中没有说明太多内容。内容如下:

directoryService = new GoogleService().buildDirectoryService();

Users result = directoryService.users().list()
        .setCustomer("my_customer")
        .setOrderBy("email")
        .execute();

public Directory buildDirectoryService() throws GeneralSecurityException, IOException {
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

        GoogleCredential credential = GoogleCredential
                .fromStream(new FileInputStream("src/main/resources/newest_service_account_creds.json"))
                .createScoped(SCOPES);

        return new Directory.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME)
                .setHttpRequestInitializer(credential).build();
    }

不幸的是,错误消息没有说明太多:

Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "Invalid Input",
    "reason" : "invalid"
  } ],
  "message" : "Invalid Input"
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1108)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at GetDrivePermissions.getFiles(GetDrivePermissions.java:35)
at Main.main(Main.java:7)

我重复了两次这个过程以确保我没有错过任何东西,包括创建一个新项目、启用API、添加一个服务帐户、添加并启用域范围的委派和获取一个凭据json文件,以及在管理UI中添加对应用程序内访问控制的访问。但是打电话

directoryService.users().list().setCustomer("my_customer").setOrderBy("email").execute();

服务仍然返回上述错误消息

错误消息指的是“无效输入”,但请求以前使用的是正常的应用程序凭据。因此,问题不在于如何调用目录服务,而在于身份验证,这是工作版本和非工作版本之间的唯一区别

由于这与使用项目凭据有关,因此我使用服务帐户的方式肯定有问题,但即使重复整个过程两次,我也找不到错误。根据我找到的关于服务账户的指南,这应该是可行的。凭证对象已创建,并且看起来正常

下一步我能做什么

提前了解情况


共 (1) 个答案

  1. # 1 楼答案

    我将此部分更改回使用应用程序自己的凭据。我有另一个使用服务帐户凭据的呼叫,并且可以正常工作,因此这是目前的解决方法