我有一个SSL安全码头网络服务器,其任务是代表用户阅读/发送电子邮件。对于阅读pub / sub是首选,而不是拉。从developers.google.com
开始执行这些步骤现在剩下要做的就是使用java客户端库来利用服务帐户凭据并代表用户与gmail api交谈(已经从用户那里收集了主题的auth&刷新令牌)
尝试了一些步骤。
使用下载的私钥(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所需的所有密钥文件。
如果我错过了什么,请告诉我。
答案 0 :(得分:0)
最初,我使用我的Web应用程序的OAuth 2.0客户端ID来获取来自特定Gmail帐户的邮件。然后我意识到我的应用程序根本不需要同意提示,而且当我偶然发现谷歌服务帐户消除了同意提示和存储授权令牌时。我确实尝试了上面发布的相同代码,并点击了"message" : "Bad Request", "reason" : "failedPrecondition"
发布的完全相同的响应。
要解决此问题,请添加.setServiceAccountUser(googleServiceAccountUser)
,其中googleServiceAccountUser设置为我的应用程序尝试阅读邮件的谷歌电子邮件ID(xxx@gmail.com)。在您提供的代码段中,缺少调用“.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;
}