【问题标题】:Server-side OAuth for user impersonation via GMail API通过 GMail API 模拟用户的服务器端 OAuth
【发布时间】:2015-12-27 05:12:30
【问题描述】:

我正在尝试执行服务器端 OAuth,以便可以使用我域中的特定用户帐户通过我的应用程序发送电子邮件(因此使用 GMail API)。

我的是一个纯粹的服务器端应用程序,我无法通过 UI 执行“用户同意”。

我在 Google App Engine 中创建了一个项目并获得了服务帐户凭据(P12 密钥)。

我的代码是这样的 -

new GoogleCredential.Builder()
  .setTransport(httpTransport)
  .setJsonFactory(JSON_FACTORY)
  .setServiceAccountId(googleEmailerServiceAccountId)
  .setServiceAccountPrivateKeyFromP12File(new File(googleEmailerServiceAccountPrivateKeyLocation)).setServiceAccountScopes(Collections.singleton(GmailScopes.GMAIL_COMPOSE))
  .setServiceAccountUser("xxx@xxx.com")
  .build()

我已根据https://developers.google.com/identity/protocols/OAuth2ServiceAccount,通过管理控制台委派了对应用程序的域范围访问(针对 GMAIL COMPOSE 范围)。

当我尝试从我的应用发送电子邮件时,我仍然收到未经授权的 401。

由于没有明确的 Gmail API 文档说明它允许域范围的委派,我猜 Gmail 不允许这样做。

有没有办法以编程方式实现这一目标?

任何想法将不胜感激。 谢谢!

【问题讨论】:

  • 除非您可以授予其他用户访问该 gmail 帐户的权限,否则我认为您不会获得使用 Gmail 的服务帐户。
  • 感谢@DalmTo 的回复。但是link 此处的此链接表示两个用户都将列在委派用户发送的电子邮件中。这对我不起作用。
  • 你能做的就是验证一次。保存刷新令牌,然后使用它来访问它。服务帐户必须经过预授权我真的认为它不适用于 Gmail,但我没有域帐户,因此无法自己测试。
  • 即使验证一次,我也必须有一个我没有的网络应用程序。我试图重新使用另一个客户端的刷新令牌,但这显然不起作用。
  • 创建一个虚拟应用程序来创建一个刷新令牌。只要您使用相同的客户端 ID,它就可以工作。 (我以前做过)

标签: gmail-api service-accounts


【解决方案1】:

据我所知,您无法在 Gmail 中使用服务帐户。服务帐号必须经过预授权。

Authorizing Your App with Gmail

对 Gmail API 的所有请求都必须由经过身份验证的人授权 用户。 Gmail 使用 OAuth 2.0 协议对 Google 进行身份验证 帐户和授权访问用户数据。您还可以使用 Google+ 登录以提供“使用 Google 登录”身份验证方法 你的应用程序。

  1. 与服务帐户共享一个 Google 驱动器文件夹。将服务帐户电子邮件作为用户添加到其有权访问的 Google 云端硬盘文件夹中
  2. 与任何其他用户一样,与服务帐户共享 Google 日历。

服务帐户不适用于所有 Google API。据我所知,您不能授予其他用户访问您的 Gmail 的权限,因此现在需要对服务帐户进行预授权。

推荐/解决方法/破解

使用相同的客户端 ID 创建一个虚拟应用程序,对其进行身份验证,获取刷新令牌,然后在您的应用程序中使用刷新令牌。

【讨论】:

  • 我对这个答案投了反对票,因为服务帐户模拟通常适用于 Gmail API。 OP 的案例中存在一个尚未确定的问题。
  • 请发布使用 Gmail 服务帐户的代码我没有看到这样做,因为没有办法对其进行预验证。我很想看看你的工作代码
  • 如果您查阅文档,您将找不到在 Gmail 中使用服务帐户的任何参考。 developers.google.com/gmail/api/auth/about-auth
  • answer 中有一个工作示例 (C#),用于“我们可以使用服务帐户访问 GMAIL API 吗?”服务帐户模拟是一种通用的 Google API 功能,因此在 Gmail API 文档中没有特别提及。
猜你喜欢
  • 2021-03-02
  • 1970-01-01
  • 2021-06-22
  • 2015-03-04
  • 2016-03-27
  • 2017-03-17
  • 1970-01-01
  • 2016-07-21
  • 2014-10-31
相关资源
最近更新 更多