我是 Google API 的新手。我有一个使用自己的域注册的 google 工作区帐户。我希望能够使用 google java api 对用户邮箱执行操作。我正在使用快速启动项目并将身份验证用作范围。
我可以对执行了 OAuth 同意的用户帐户执行操作。
看例子
String user = "me";
ListLabelsResponse listResponse = service.users()
.labels().list(user).execute();
它使用“我”关键字作为用户,我想使用帐户中的一个用户并执行相同的操作。当我将“我”切换到我域中的一个用户时,我得到以下信息。
GET https://gmail.googleapis.com/gmail/v1/users/user@somedomain.what.ever/labels
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Delegation denied for admin@mirncast.uk",
"reason" : "forbidden"
} ],
"message" : "Delegation denied for admin@mirncast.uk",
"status" : "PERMISSION_DENIED"
}
据我了解,我需要提供用户委托。用户委托需要服务帐户。所以我试着按照这个教程
我的代码最终成为
Set<String> scope = Collections.singleton(GmailScopes.MAIL_GOOGLE_COM);
GoogleCredential credentialFromJson = GoogleCredential
.fromStream(new FileInputStream(
"/certificate.json"))
.createScoped(scope);
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(credentialFromJson.getServiceAccountId())
.setServiceAccountPrivateKey(credentialFromJson.getServiceAccountPrivateKey())
.setServiceAccountScopes(Collections.singleton(GmailScopes.MAIL_GOOGLE_COM))
.setServiceAccountUser("user@somedomain.what.ever")
//.setServiceAccountUser("service@custom-octagon-1234567.iam.gserviceaccount.com")
.build();
Gmail service = new Gmail.Builder(httpTransport, jsonFactory, credential).setApplicationName("remediation service").build();
String user = "user@somedomain.what.ever";
final var messagesResponse = service.users().messages().list(user).execute();
System.out.println(messagesResponse.getMessages().stream().map(message -> message.getId()).collect(Collectors.joining(",")));
这段代码有一些问题。
只有当我使用我尝试访问的相同电子邮件地址设置 setServiceAccountUser 时,我才能使其工作。从我的角度来看,以这种方式使用 API 会破坏目的。使用服务帐户时出现以下错误
Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
GET https://gmail.googleapis.com/gmail/v1/users/hraman@gsuite-dev.mirncast.uk/messages
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "Precondition check failed.",
"reason" : "failedPrecondition"
} ],
"message" : "Precondition check failed.",
"status" : "FAILED_PRECONDITION"
}
该示例使用已弃用的 API GoogleCredential,我无法确定基于 OAuth2 身份验证的最新 API 是什么
我的 Maven 依赖项
<dependencies>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-gmail</artifactId>
<version>v1-rev20210301-1.31.0</version>
</dependency>
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client-jetty</artifactId>
<version>1.31.4</version>
</dependency>
</dependencies>