用于通过 GMail 模拟用户的服务器端 OAuth API

Server-side OAuth for user impersonation via GMail API

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

我的是纯服务器端应用程序,我无法通过 UI.

执行 "user consent"

我已经在 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 中使用服务帐户。服务帐户必须预先授权。

Authorizing Your App with Gmail

All requests to the Gmail API must be authorized by an authenticated user. Gmail uses the OAuth 2.0 protocol for authenticating a Google account and authorizing access to user data. You can also use Google+ Sign-in to provide a "sign-in with Google" authentication method for your app.

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

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

建议/解决方法/技巧

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