服务器端OAuth,用于通过GMail API进行用户模拟

时间:2015-09-29 16:05:18

标签: gmail-api service-accounts

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

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

我在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。

有没有办法以编程方式实现此目的?

任何想法都会非常感激。 谢谢!

1 个答案:

答案 0 :(得分:0)

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

  

Authorizing Your App with Gmail

     

对Gmail API的所有请求必须经过身份验证授权   用户。 Gmail使用 OAuth 2.0 协议对Google进行身份验证   帐户和授权访问用户数据。您也可以使用Google+   登录即可与Google"登录认证方法   你的应用。

  1. 与服务帐户共享Google云端硬盘文件夹。在具有访问权限的Google云端硬盘文件夹中以用户身份添加服务帐户电子邮件
  2. 与其他任何用户一样,与服务帐户共享Google日历。
  3. 服务帐户不适用于所有Google API。据我所知,您无法让其他用户访问您的Gmail,因此现在可以预先授权该服务帐户。

    推荐/解决/黑客

    使用相同的客户端ID创建虚拟应用程序,验证它获取刷新令牌,然后在应用程序中使用刷新令牌。