Gmail API 设置服务帐户并代表用户阅读/发送邮件

问题描述 投票:0回答:2

我有一个受 SSL 保护的 jetty Web 服务器,其任务是代表用户读取/发送电子邮件。对于阅读,首选 pub/sub,而不是 pull。已按照 developers.google.com

中的步骤操作
  1. 在控制台中创建了一个项目,启用了 Gmail api,使用 google apps 域范围委托创建了服务帐户,下载了 json 和 p12 私钥
  2. 通过选择 Web 应用程序创建 OAuth 客户端 ID,为其命名,并将授权重定向 URI 添加到 Web 服务器 API 端点之一
  3. 使用控制台 API 授予主题发布权限
  4. 在 pub-sub 中创建主题并使用 HTTPs 端点订阅。使用控制台API手动检查发布消息并成功接收

现在剩下要做的就是使用 java 客户端库来利用服务帐户凭据并代表用户与 gmail api 进行对话(已从用户那里收集了该主题的身份验证和刷新令牌)

已尝试的步骤。

  1. 使用下载的私钥(p12)尝试创建凭证并用于检索邮件标签的示例

    HttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();    
    String serviceAccount = "[email protected]";
    Credential credential = GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)    
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(serviceAccount)
    .setServiceAccountPrivateKeyFromP12File(new File("/path-to-key-file.p12"))
    .setServiceAccountScopes(Collections.singleton(GmailScopes.GMAIL_LABELS))
    .build();
    Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, cred).setApplicationName("web-application-name-created-via-console").build();
    String user = "me"; //Tried direct email id also  
    service.users().labels().list(user).execute();
    

回应,

{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "Bad Request",
    "reason" : "failedPrecondition"
  } ],
  "message" : "Bad Request"
}

注意:编码部分是在本地服务器上尝试的,而不是有 SSL 的服务器。我认为这不应该是一个问题,因为我拥有访问 api 所需的所有密钥文件。

如果我遗漏了什么,请告诉我。

java webserver gmail-api google-api-java-client
2个回答
1
投票

最初,我在 Web 应用程序中使用 OAuth 2.0 客户端 ID 从特定 Gmail 帐户获取消息。然后我意识到我的应用程序根本不需要同意提示,就在那时我偶然发现了谷歌服务帐户,它消除了同意提示和授权令牌的存储。我确实尝试了上面发布的完全相同的代码,并发现了发布的完全相同的响应

"message" : "Bad Request", "reason" : "failedPrecondition"

为了解决此问题,添加了

.setServiceAccountUser(googleServiceAccountUser)
,其中 googleServiceAccountUser 设置为我的应用程序尝试从中读取消息的 Google 电子邮件 ID ([电子邮件受保护])。在您的代码片段中,缺少调用“.setServiceAccountUser()”,添加它可能会帮助您解决问题。

private static Credential authorize() throws Exception {

  GoogleCredential credential = new GoogleCredential.Builder()
  .setTransport(httpTransport)
  .setJsonFactory(JSON_FACTORY)
  .setServiceAccountId(googleServiceAccountId)
  .setServiceAccountPrivateKeyFromP12File(new File(privatekeyFile))
  .setServiceAccountScopes(Collections.singleton(GmailScopes.MAIL_GOOGLE_COM))
  .setServiceAccountUser(googleServiceAccountUser)
  .build();

  return credential;
}

0
投票

我看过一篇非常好的文章,其中所有内容都用 java 示例代码进行了解释。 链接

© www.soinside.com 2019 - 2024. All rights reserved.