当前位置: 首页 > 知识库问答 >
问题:

谷歌管理目录API,错误请求400无效授权。(使用服务帐户)

杜海
2023-03-14

所以在展示我的代码之前,让我解释一下我采取了哪些步骤来“正确”设置服务号环境。

>

def getDirectoryService: Directory = {
  val httpTransport: HttpTransport = new NetHttpTransport()
  val jsonFactory: JacksonFactory = new JacksonFactory()
  val credential: GoogleCredential = new GoogleCredential.Builder()
    .setTransport(httpTransport)
    .setJsonFactory(jsonFactory)
    .setServiceAccountId("xxxxx@xxxx.iam.gserviceaccount.com")
    .setServiceAccountScopes(util.Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_GROUP_READONLY, DirectoryScopes.ADMIN_DIRECTORY_GROUP_MEMBER_READONLY))
    .setServiceAccountUser("admin@domain.com")
    .setServiceAccountPrivateKeyFromP12File(
      new java.io.File("/pathToKey/privatekey.p12"))
    .build()
  val service: Directory = new Directory.Builder(httpTransport, jsonFactory, null)
    .setHttpRequestInitializer(credential).build()
  service
}

然后我试图执行这样的事情:

service.groups().list().execute()  

    service.groups().list("domain.com").execute()

这个代码会导致,

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: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)
        at com.company.project.GoogleServiceProvider.getGroups(GoogleServiceProvider.scala:81)
        at com.company.project.ProjectHandler.handle(ProjectHandler.scala:110)
        at com.company.common.web.DispatcherServlet.service(DispatcherServlet.scala:40)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:845)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:224)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1174)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1106)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
        at org.eclipse.jetty.server.Server.handle(Server.java:524)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
        at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
        at java.lang.Thread.run(Thread.java:745)

我做错了什么?在过去的两天里,我一直在寻找解决方案,并尝试了很多方法。我还不确定的解决方案之一是ntp同步(比如如何将服务器时间精确同步到ntp)。

任何建议都会很有帮助,谢谢!

更新:我还确保激活了Admin Directory SDK,并在开发者控制台上启用了域范围的委派。

更新#2:我忘了提到,管理员帐户不是项目本身的所有者。所以基本上,我是一个域的成员,我创建了一个项目,所以我是项目和服务号的唯一所有者。(我不是管理员)。但是管理员应该是项目的所有者并创建服务号才能正常工作吗???

共有1个答案

萧英光
2023-03-14

好的,我的问题是,在setServiceAccountUser中,我输入了管理员组的电子邮件地址,而不是实际的用户帐户。显然,它不允许将组电子邮件(别名)地址放入setServiceAccountUser。因此,在输入一个具有管理员权限的实际用户帐户后,它似乎可以正常工作。

但我仍然想知道什么是最好的做法。如中所示,我是否应该仅为该项目创建一个具有管理员权限的单独用户帐户?我绝对不想在我的代码中输入管理员帐户的电子邮件地址。

 类似资料:
  • 我收到了这个错误 已经跟踪了https://developers.google.com/admin-sdk/directory/v1/guides/delegation 我使用这个库,并在laravel 5.7:https://github.com/spatie/laravel-google-calendar上运行它 有什么办法可以解决这个问题。请帮忙。

  • 我目前正试图通过Spring Security获得JWT访问令牌。 我不确定为什么凭据不匹配 数据库ˌ资料库 我的data.sql用户从h2-in-memory DB中取出,并Hibernate到一个使用UserDetailsService的对象中: 法典 我的安全配置 我的认证服务器配置 邮差 提交带有以下内容的邮递员请求时: 授权 基本认证 用户名:jwt-example 密码:[未加密的密码

  • 我使用以下代码从搜索控制台获取我的网站的统计数据: 我使用google服务帐户来授权api调用,但它给了我一个错误: 呼叫POST时出错https://www.googleapis.com/webmasters/v3/sites/http://www.example.com//searchAnalytics/query: (403)用户没有足够的权限访问站点“http*:///www.exampl

  • 我正在尝试向Google AdWords API发出任何请求,该请求将返回非错误。 我使用开发者令牌创建了生产MCC帐户,此外,我还从测试帐户在google开发者控制台中创建了测试MCC帐户和OAuth2应用程序。 另外,我已经测试了不同的帐户(生产MCC,测试MCC,启用adword的用户,没有adword的用户)为auth应用程序/用户从谁的请求已 适用于任何设置/不同的客户端。我正在获取访问

  • 我正面临着以下问题:我已经创建了一个谷歌服务帐户,现在我正在尝试使用c#对谷歌API和YouTube数据API进行授权API调用。以下是我的示例代码: 代码生成成功,但当我启动程序时,我收到以下错误消息: 系统.IO.File未发现异常:“无法加载文件或程序集”弹跳卡思加密,版本=1.7.4137.9688,区域性=非特定,公钥令牌=a4292a325f69b123“或其依赖项之一。系统找不到指定

  • 我想使用谷歌驱动器作为一个网站的准CMS工作,我正在使内容所有者可以编辑他们的内容使用谷歌驱动器。我希望使用一个可以访问Google Drive的特定用户帐户(在写这篇文章时,服务帐户不能直接访问Google Drive),并且能够与内容所有者共享文档。 在阅读了API和教程之后,我在委托中找到了答案:https://developers.google.com/drive/development