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

谷歌oauth2冒充服务帐户与 user@gmail.com

韩弘方
2023-03-14

我想访问一些谷歌api服务:

    < li>GDrive API < li >联系API < li >人员API

我正在使用oauth2模拟服务帐户流(您知道的:Google Oauth v2-服务帐户描述)。为了实现不健全化,您需要在Google应用程序控制台中应用“授权域范围权限”,下载相应的pk12文件,并在Google控制台项目中激活api。

目前我总是得到:

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 oauthsample.GDriveAPI.<init>(GDriveAPI.java:50)
at oauthsample.GDriveAPI.main(GDriveAPI.java:85)

这是我的代码:

        HttpTransport httpTransport = new NetHttpTransport();
        JacksonFactory jsonFactory = new JacksonFactory();    

        Set<String> scopes = new HashSet<String>();
        scopes.add("https://www.google.com/m8/feeds");

        GoogleCredential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(JSON_FACTORY)
                .setServiceAccountId("myserviceuser@xxxxxx.iam.account.com")
                .setServiceAccountPrivateKeyFromP12File(new File("somep12key.p12"))
                .setServiceAccountScopes(scopes)
                .setServiceAccountUser("my_user_name@gmail.com")
                .build();

       credential.refreshToken();
       ContactsService service = new ContactsService("MYAPP");
        service.getRequestFactory().setHeader("User-Agent", "MYAPP");
        service.setHeader("GData-Version", "3.0");
        service.setOAuth2Credentials(credential);

        URL feedUrl = new URL("https://www.google.com/m8/feeds/contacts/default/full");
        ContactFeed resultFeed = service.getFeed(feedUrl, ContactFeed.class);

我还在stackoverflow中进行了大量搜索(无法列出所有参考资料并检查回复和html" target="_blank">解决方案)。但是有一个问题从未得到明确回答——在谷歌文档中也没有,在所有stackoverflow帖子中也没有:

  • 是否真的可以使用普通user@gmail.com用户模拟一个服务帐户(我的意思是一个普通的gmail帐户,无法访问“将域范围的权限委托给服务号”一章中提到的管理控制台,并且没有自己的域)?

有人说是,有人说不是。那么绝对的事实是什么?

就我在阅读谷歌文档时所理解的:服务帐户只能在您负责自己的域时模拟用户,并且您需要有一个注册了自己域的谷歌工作帐户。然后,您可以访问管理控制台并授予对服务帐户的访问权限。

感谢您的耐心和时间回答。

最好的问候马特

共有1个答案

东方淇
2023-03-14

简短的回答是不,不可能对@gmail.com帐户执行服务帐户模拟。关键原因是,尽管服务号OAuth流不涉及授权屏幕,但最终还是有人必须说“我授权此应用程序模拟此用户”。

在Google Apps域中,这个人就是域管理员,他有权批准域中所有用户的应用程序。对于@gmail.com帐户,没有其他机构可以代表您批准。如果您无论如何都必须请求用户授权,那么使用常规的三分支OAuth流来提示用户授权、获取刷新令牌等是有意义的。

现在有一个小技巧,你可以带一个@gmail.com用户通过常规的三足流程,一旦他们批准,从那时起使用服务帐户流程。这导致了一些奇怪的问题,所以我们禁用了这个选项。这可能是为什么过去对这是否可能存在分歧的原因。

 类似资料:
  • 上述代码的结果是: 已打开。服务帐户客户端 ID 在 GSuite 中使用适当的作用域进行授权。 服务帐户适用于普通凭据。它只适用于委托凭证。 我在我们的域中尝试了不同的API(范围)和不同的用户。 我有一个同事试图从头开始编写一个样本,他得到了同样的东西。

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

  • 我正在使用一个服务帐户访问我们的域名用户的谷歌驱动器,这工作像一个魅力!然而,我现在正在尝试使用相同的服务帐户获得用户的activity在谷歌驱动器。 我已授予服务帐户API访问https://www.googleapis.com/auth/activity和https://www.googleapis.com/auth/drive的权限 并启用API! 然而我总是得到错误403,禁止! 可能需要

  • 我正在使用Google. net客户端库来访问谷歌日历应用编程接口。我需要研发创建日历事件并将其发布给用户的应用程序。 这是一个服务器到服务器的应用程序,所以我创建了一个服务帐户,并用它来发送邀请。当从web浏览器提交响应时,创建的与会者对这些事件的响应将被更新,但当来自outlook等任何邮件客户端的响应时,响应将以电子邮件的形式发送给服务帐户电子邮件id(这是一个虚拟电子邮件id)。如何将有效

  • 有三种类型的google apiclient_id: 1. Web应用程序 2.服务帐户 3.已安装的应用程序 我用了基于 oauth2 客户端成功安装应用程序,但在 2 上失败。我想使用 oauth2.0 凭据访问我自己的 gmail 。 我得到了一个与问题相同的例外。我在尝试将添加到凭据时遇到另一个异常: 我正在尝试解决问题,使用< code >凭据而不使用< code>sub: 尝试将与一起

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