我正在尝试通过服务帐户使用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文件,以及添加访问权限进入管理界面中“应用访问控制”中的应用。但是调用
directoryService.users().list().setCustomer("my_customer").setOrderBy("email").execute();
服务仍返回上述错误消息。
错误消息指的是“无效输入”,但是该请求以前使用正常的应用程序凭据起作用。因此,问题必须不在于我如何调用目录服务,而在于我的身份验证,这是工作版本与非工作版本之间的唯一区别。
由于这可以使用项目凭据进行工作,所以我使用服务帐户的方式一定存在问题,但是即使重复了两次整个过程,我仍然找不到错误。根据我发现的有关服务帐户的指南,这应该可行。凭证对象已创建,并且看起来正确。
接下来我要看什么?
请提前获得任何见解。
老实说,我不知道自己做了什么,因为我一直在不断尝试解决方案。但现在可以使用。