当前位置: 首页 > 面试题库 >

我是否需要G Suite帐户来发出使用服务帐户模拟用户的请求?

徐友樵
2023-03-14
问题内容

我正在尝试向Drive API发出使用服务帐户模拟用户的请求,但出现TokenResponseException: 401 Unauthorized异常。

我已经按照https://developers.google.com/identity/protocols/OAuth2ServiceAccount中的说明进行了操作:

  • 在https://console.developers.google.com中,创建一个项目>凭证>服务帐户> P12文件;
  • 启用的Drive API;
  • 启用域范围的委派;
  • 在https://console.developers.google.com/iam-admin/iam中,添加了Project> Editor电子邮件许可test@gmail.com示例)。

然后,在我的代码中:

File p12 = new File("p12FileFromDevelopersConsole.p12");
HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();

GoogleCredential c = new GoogleCredential.Builder()
    .setTransport(transport)
    .setJsonFactory(jsonFactory)
    .setServiceAccountId("MY_ID@MY-ID.iam.gserviceaccount.com")
    .setServiceAccountUser("test@gmail.com")
    .setServiceAccountScopes(Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA, DriveScopes.DRIVE_FILE, DriveScopes.DRIVE_METADATA_READONLY))
    .setServiceAccountPrivateKeyFromP12File(p12)
    .build();

List<com.google.api.services.drive.model.File> files = drive.files()
    .list()
    .setSpaces("drive")
    .setFields("nextPageToken, files(id, name, webViewLink)")
    .setPageSize(10)
    .execute() // < --- exception is thrown here
    .getFiles();

for(com.google.api.services.drive.model.File f : files) {
    System.out.println(f.getName());
}

堆栈跟踪为:

com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized
    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:384)
    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:868)
    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)

我可以注意到,如果我注释掉该行.setServiceAccountUser("test@gmail.com"),则可以执行代码,并且在我的代码中显示“入门”
System.out.println

我见过很多关于这个问题的文章,但是没有一个具体的解决方案。然后,我查看了上面引用的文档,并说了很多遍G Suite,然后我意识到可能是这些请求仅适用于G Suite帐户。我对吗?如果没有,我该如何运作?


问题答案:

是的,服务帐户的域范围委派仅适用于GSuite用户,因为GSuite管理员必须授予服务帐户域范围的权限-
请参阅此处的步骤4:https
:
//developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority

考虑使用常规的OAuth(https://developers.google.com/identity/protocols/OAuth2WebServer)从您的gmail帐户授予对您的网络应用的访问权限。



 类似资料:
  • 问题内容: 我正在尝试向Drive API发出使用服务帐户模拟用户的请求,但出现异常。 我已经按照https://developers.google.com/identity/protocols/OAuth2ServiceAccount中的说明进行了操作: 在https://console.developers.google.com中,创建一个项目>凭证>服务帐户> P12文件; 启用的Drive

  • 问题内容: 上述代码的结果是: 开启。服务帐户客户ID已在GSuite中使用适当的范围进行了授权。 该服务帐户可用于普通凭据。它仅不适用于委托凭证。 我在我们的域中尝试了不同的API(作用域)和不同的用户。 我有一个同事尝试从头开始编写示例,他得到了同样的东西。 问题答案: 我认为您的问题是,在调用Calendar API 之前,您没有对凭据进行授权,但是我在自己的实现中使用了一些区别 使用以下导

  • 我们正在整合谷歌日历和我们的房间预订系统。GSuite域中的用户应该登录我们的预订屏幕并预订房间。到目前为止,我使用了一个具有域范围委托的服务帐户来模拟用户(< code>setSubject()方法,传递被模拟用户的电子邮件地址)。一切都正常,尽管这样我们无法验证我们想要模拟的用户是否成功登录,事件将只是以他作为组织者来创建,因为setSubject()只需要电子邮件正常工作。在IBM Domi

  • 根据留档 GSuite Marketplace应用程序OAuth Web服务器应用程序离线访问 网络服务器应用程序可以由域的管理员通过 OAuth 授予域访问权限。对于其他域用户模拟,可以使用服务帐户。 在我的设置中,我有 > 启用了管理员 Gmail 市场 SDK 市场 API 的 Web 服务器应用。 Web服务器应用程序凭据可用。 提供具有域范围授权和凭据的服务帐户。 对于步骤 获取 Web

  • 问题内容: 我想访问一些Google API服务: GDrive API 联系API 人物API 而且,我正在努力模拟oauth2模拟服务帐户流程(您知道一个:Google Oauth v2- 服务帐户说明。要进行模拟,您需要在google应用控制台中应用“委派域范围的授权”,请下载相应的pk12文件并在Google控制台项目中激活api。 此刻我总是得到: 这是我的代码: 我还通过stackov

  • 我正在尝试在 Go 应用引擎部署上使用具有域范围委派 (DwD) 的服务帐户。 我已按照使用 Google 应用程序默认凭据的步骤将服务帐户与应用引擎配合使用。 我让代码在我的开发计算机上本地运行,但我被困在从我的域中检索实际数据。 我用的是Admin SDK。在“向您的服务帐户授予域范围的权限”一节中,它说我的“服务帐户需要模拟其中一个用户来访问Admin SDK Directory API”。