我需要通过Graph API从Outlook邮箱中读取邮件。我正在编写的应用程序是计划的批处理作业,无需用户交互。由于合规性原因,我无法使用应用程序权限。该应用程序必须不能访问租户上的所有邮箱。我为共享共享允许的邮箱的技术用户使用委派权限。我能够通过ADAL4J获得JWT访问令牌,并成功使用它调用了一些API,但是每当我尝试读取邮箱(甚至是技术用户邮箱)时,我都会被禁止使用403。
我从这个正式的[样本](https://github.com/Azure-Samples/active-directory-java-native-headless/)开始。在Azure中设置我的应用程序后,此示例立即可用。然后,我将Graph调用更改为“ https://graph.microsoft.com/v1.0/me/messages”,突然间我得到了403 Forbidden。为避免权限问题,我将Azure AD中所有可用的委派权限添加到了应用程序中,并为所有内容提供了管理员同意。不幸的是,这没有改变。当我检查令牌的内容时,我看到包含所有权限的scp字段。奇怪的是,我实际上可以写邮箱。我可以通过Graph API写入草稿文件夹。但是,当我使用返回的消息ID并尝试查询刚刚创建的同一消息时,我再次收到403 Forbidden。
获取令牌
private static AuthenticationResult getAccessTokenFromUserCredentials(
String username, String password) throws Exception {
AuthenticationContext context;
AuthenticationResult result;
ExecutorService service = null;
try {
service = Executors.newFixedThreadPool(1);
context = new AuthenticationContext(AUTHORITY, false, service);
Future<AuthenticationResult> future = context.acquireToken(
"https://graph.microsoft.com", CLIENT_ID, username, password,
null);
result = future.get();
} finally {
service.shutdown();
}
return result;
}
调用消息端点:
URL url = new URL("https://graph.microsoft.com/v1.0/me/messages");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Authorization", "Bearer " + accessToken);
conn.setRequestProperty("Accept","application/json");
int httpResponseCode = conn.getResponseCode();