如何使用令牌中的适当权限阅读电子邮件
How to read email with proper rights in token
我正在尝试将应用程序(它应该每隔几分钟从邮箱中提取一次电子邮件)从已弃用的 Microsoft EWS API 升级到新的 Graph API,但我遇到了一些问题。
这是我的 class 连接器 :
public class O365graphApiConnector {
private final GraphServiceClient<Request> graphClient;
public O365graphApiConnector(String clientId, String username, String password) {
final UsernamePasswordCredential usernamePasswordCredential =
new UsernamePasswordCredentialBuilder()
.clientId(clientId)
.username(username)
.password(password)
.build();
final TokenCredentialAuthProvider tokenCredentialAuthProvider =
new TokenCredentialAuthProvider(usernamePasswordCredential);
graphClient=GraphServiceClient.builder()
.authenticationProvider(tokenCredentialAuthProvider)
.buildClient();
}
public User getUserProfile() {
return graphClient.me().buildRequest().get();
}
public MessageCollectionPage getOutlookEmails() {
return graphClient.me().messages().buildRequest().get();
}
}
我正在使用 com.azure:azure-identity:1.4.2
和 com.microsoft.graph:microsoft-graph:5.8.0
。
我构建了连接器,传递了 clientId
、username
和 password
。我可以打电话 getUserProfile
,我得到了一些东西,所以身份验证“有效”。
但是,我在调用 getOutlookEmails
时收到 404:
SEVERE: Throwable detail:
com.microsoft.graph.http.GraphServiceException: Error code:
ResourceNotFound Error message: Resource could not be discovered.
GET https://graph.microsoft.com/v1.0/me/messages SdkVersion :
graph-java/v5.8.0
404 : Not Found [...]
当我在调试模式下 运行 拦截令牌时,它似乎没问题:我拥有我的管理员授予应用程序帐户的一系列权限:
"scp": "EWS.AccessAsUser.All Mail.Read Mail.Read.Shared Mail.ReadBasic Mail.ReadWrite
Mail.ReadWrite.Shared Mail.Send Mail.Send.Shared MailboxSettings.ReadWrite User.Read User.Read.All User.ReadWrite profile openid email"
这是我们在管理员端看到的部分内容(截图后添加了更多权限):
我的理解是,这应该足以以编程方式访问给定邮箱的电子邮件,但显然,事实并非如此。
知道我遗漏了什么吗?
实际上,我使用的技术“用户”并没有真正的邮箱(尽管用户名是一个电子邮件地址……这让我很困惑)。
它已经获得了我感兴趣的给定邮箱的权限,所以修复只是在检索邮件之前 select mailbox/user :
public MessageCollectionPage getOutlookEmailsFor(String mailbox) {
return graphClient.users(mailbox).messages().buildRequest().get();
}
我正在尝试将应用程序(它应该每隔几分钟从邮箱中提取一次电子邮件)从已弃用的 Microsoft EWS API 升级到新的 Graph API,但我遇到了一些问题。
这是我的 class 连接器 :
public class O365graphApiConnector {
private final GraphServiceClient<Request> graphClient;
public O365graphApiConnector(String clientId, String username, String password) {
final UsernamePasswordCredential usernamePasswordCredential =
new UsernamePasswordCredentialBuilder()
.clientId(clientId)
.username(username)
.password(password)
.build();
final TokenCredentialAuthProvider tokenCredentialAuthProvider =
new TokenCredentialAuthProvider(usernamePasswordCredential);
graphClient=GraphServiceClient.builder()
.authenticationProvider(tokenCredentialAuthProvider)
.buildClient();
}
public User getUserProfile() {
return graphClient.me().buildRequest().get();
}
public MessageCollectionPage getOutlookEmails() {
return graphClient.me().messages().buildRequest().get();
}
}
我正在使用 com.azure:azure-identity:1.4.2
和 com.microsoft.graph:microsoft-graph:5.8.0
。
我构建了连接器,传递了 clientId
、username
和 password
。我可以打电话 getUserProfile
,我得到了一些东西,所以身份验证“有效”。
但是,我在调用 getOutlookEmails
时收到 404:
SEVERE: Throwable detail: com.microsoft.graph.http.GraphServiceException: Error code: ResourceNotFound Error message: Resource could not be discovered.
GET https://graph.microsoft.com/v1.0/me/messages SdkVersion : graph-java/v5.8.0
404 : Not Found [...]
当我在调试模式下 运行 拦截令牌时,它似乎没问题:我拥有我的管理员授予应用程序帐户的一系列权限:
"scp": "EWS.AccessAsUser.All Mail.Read Mail.Read.Shared Mail.ReadBasic Mail.ReadWrite
Mail.ReadWrite.Shared Mail.Send Mail.Send.Shared MailboxSettings.ReadWrite User.Read User.Read.All User.ReadWrite profile openid email"
这是我们在管理员端看到的部分内容(截图后添加了更多权限):
我的理解是,这应该足以以编程方式访问给定邮箱的电子邮件,但显然,事实并非如此。
知道我遗漏了什么吗?
实际上,我使用的技术“用户”并没有真正的邮箱(尽管用户名是一个电子邮件地址……这让我很困惑)。
它已经获得了我感兴趣的给定邮箱的权限,所以修复只是在检索邮件之前 select mailbox/user :
public MessageCollectionPage getOutlookEmailsFor(String mailbox) {
return graphClient.users(mailbox).messages().buildRequest().get();
}