嗨,我正在尝试使用Google的gmail api在服务器上实现发送/接收电子邮件:
private GoogleCredential authorize(HttpTransport httpTransport, JsonFactory jsonFactory ) {
try{
Resource resource = new ClassPathResource("my_key_in_json_format.");
InputStream input = resource.getInputStream();
GoogleCredential credential = GoogleCredential.fromStream(input);
credential.createScoped(GmailScopes.all());
credential.refreshToken();
return credential;
}catch(IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
但是,当凭据尝试刷新令牌时,出现以下异常:
com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
"error" : "invalid_scope",
"error_description" : "Bad Request"
}
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:394)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:493)
at com.snobo.util.GmailService.authorize(GmailService.java:79)
我尝试将范围参数更改为:
Collection<String> SCOPES = Collections.unmodifiableCollection(Arrays.asList(new String[]{GmailScopes.GMAIL_READONLY}));
并且刷新令牌时也失败了。 Google的在线文档并非真的对Java友好。有人遇到类似的问题吗?
答案 0 :(得分:1)
经过搜索后,我根据此线程找到了问题的答案:
400 Bad Request on Gmail API with php
”“如果您只想访问一个帐户(您自己的),则不应使用服务帐户。服务帐户是他们自己的帐户,不是Gmail帐户。它们可以很好地用于不需要用户(例如地图,搜索),或者您正在使用Google Apps for Work域并且希望为域中的所有用户启用委派(通过域管理员,因此您不需要个人用户授权)。“
我已经修改了实现以现在使用oauth Web流。我对Google的文档感到非常失望,因为应该彻底,简洁地解决此问题。我敢肯定,“服务帐户”和“域范围授权”会误导许多开发人员将服务帐户方法用于多种类型的个人/个人帐户应用程序。