【发布时间】:2017-09-27 13:37:50
【问题描述】:
我在通过 Microsoft Graph API 访问我的 office 365 帐户时遇到一个(或两个)问题。
第一个问题是我有一个 java 程序试图列出 office 365 订阅中的所有用户。我打电话给https://graph.microsoft.com/v1.0/users/,但得到了403 forbidden 的回复。
在应用注册时,我在委派和应用权限上添加了包括User.Read、User.ReadBasic.All、User.ReadWrite 在内的权限。
我也尝试过使用图形资源管理器,但是当我进入使用我的帐户时,它仍然使用内置图形用户并且不显示我的应用程序登录信息。不确定这些是否相关。
这是导致 403 的代码 sn-p
AuthenticationResult result = getAccessTokenFromUserCredentials(RESOURCE_GRAPH, ID, PASSWORD);
URL url = new URL("https://graph.microsoft.com/v1.0/users/") ;
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
conn.setRequestProperty("Authorization", "Bearer "+result.getAccessToken());
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
这是获取令牌的方法
private static AuthenticationResult getAccessTokenFromUserCredentials(String resource,
String username, String password) throws Exception {
AuthenticationContext context;
AuthenticationResult result = null;
ExecutorService service = null;
try {
service = Executors.newFixedThreadPool(1);
context = new AuthenticationContext(AUTHORITY, false, service);
Future<AuthenticationResult> future = context.acquireToken(
resource, CLIENT_ID, username, password,
null);
result = future.get();
} finally {
service.shutdown();
}
if (result == null) {
throw new ServiceUnavailableException(
"authentication result was null");
}
return result;
}
【问题讨论】:
-
你如何验证用户以获取你传递给
/users的令牌? -
更新了代码示例。如果我打电话给graph.microsoft.com/v1.0/me,我会取回代表我的用户的 json 字符串。但是如果我用 /users/ 打电话,我会得到 403。我还可以访问共享点端点并获取站点数据等。
-
User.ReadBasic.All 需要管理员同意,您是否尝试过获得管理员同意?你在哪里注册应用程序,在 azure 门户中?
-
它在 apps.dev.microsoft.com 上注册,然后它也显示为我的用户下的应用程序在 azure 门户中。虽然,当我查看 azure 时,它会将其列为默认访问。但是,当我列出权限时,它会告诉我我已经读取了用户同意和管理员同意。该应用程序声明其访问权限是用户同意。我在哪里可以更改?
标签: azure-active-directory microsoft-graph-api