【发布时间】:2016-05-14 10:05:22
【问题描述】:
我有一个 SSL 安全的码头网络服务器,其任务是代表用户阅读/发送电子邮件。阅读 pub/sub 是首选,而不是 pull。已从developers.google.com 执行这些步骤
- 在控制台中创建了一个项目,启用了 Gmail api,使用谷歌应用程序域范围委托创建了服务帐户,下载了 json 和 p12 私钥
- 通过选择 Web 应用程序创建 OAuth 客户端 ID 并为其命名,并将授权的重定向 URI 添加到 Web 服务器 api 端点之一
- 使用控制台 api 授予主题的发布权
- 在 pub-sub 中创建主题并使用 HTTPs 端点订阅。使用控制台 API 手动检查发布消息并成功接收
现在剩下要做的就是使用 java 客户端库来利用服务帐户凭据并代表用户与 gmail api 交谈(已从用户那里收集了该主题的身份验证和刷新令牌)
已尝试的步骤。
-
使用下载的私钥 (p12) 尝试创建凭据并获取邮件标签的示例
HttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); String serviceAccount = "service-account@myproject.iam.gserviceaccount.com"; 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。
如果我遗漏了什么,请告诉我。
【问题讨论】:
-
您有什么方法可以记录最终请求的外观吗? :) 那会很有用。例如。方法,网址和标题。
-
您解决了吗?您如何代表用户发送信息?
-
是的,使用 GoogleCredential.getApplicationDefault()
标签: java webserver gmail-api google-api-java-client