使用 Java 访问受 Azure 活动目录保护的 Web 服务
access a azure active directory protected web service using Java
这是背景:
- 应用服务A,使用Tomcat和Springboot,提供web服务端点。例如
https://xxx.azurewebsites.net/appA/order/1111
- webapp A 受 AAD 身份验证保护(快速配置)。应用程序 (web-app) 在 AAD 中注册。 web-app 的客户端 ID 是 [client-id].
- 客户端密码 [客户端密码] 在 web-app 中创建。
- AAD 目录 ID 为 [tenant-id].
- 使用浏览器打开上面的URL。显示 AD 登录页面,输入凭据后,我可以获得预期的 json 文件。
现在我有另一个控制台应用程序试图从 webapp A 获取订单信息。代码如下:
String AUTHORITY = "https://login.microsoftonline.com/" + [tenant-id];
String ORDER_URL = "https://xxx.azurewebsites.net/appA/order/1111"
ExecutorService service = Executors.newFixedThreadPool(1);
ClientCredential credentials = new ClientCredential([client-id], [client-secret]);
AuthenticationContext context = new AuthenticationContext(AUTHORITY, false, service);
Future<AuthenticationResult> future = context.acquireToken("https://graph.microsoft.com", credentials, null);
AuthenticationResult result = future.get();
String token = result.getAccessToken();
System.out.println(token);
HttpURLConnection conn = (HttpURLConnection) new URL(ORDER_URL).openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setRequestMethod("GET");
conn.setRequestProperty("Authorization", "Bearer " + token);
conn.connect();
int responseCode = conn.getResponseCode();
System.out.println(responseCode);
InputStream is = conn.getInputStream();
...
我可以获取令牌,但响应代码为 401,错误消息为 "You do not have permission to view this directory or page"。
那么我是否需要分配其他 API 权限才能使其正常工作?或者还有其他一些设置被遗漏了。
我可以重现您的问题,resource
应该是您要访问的应用程序的 client-id
或 Application ID URI
,而不是 MS 图 https://graph.microsoft.com
。
这是背景:
- 应用服务A,使用Tomcat和Springboot,提供web服务端点。例如
https://xxx.azurewebsites.net/appA/order/1111
- webapp A 受 AAD 身份验证保护(快速配置)。应用程序 (web-app) 在 AAD 中注册。 web-app 的客户端 ID 是 [client-id].
- 客户端密码 [客户端密码] 在 web-app 中创建。
- AAD 目录 ID 为 [tenant-id].
- 使用浏览器打开上面的URL。显示 AD 登录页面,输入凭据后,我可以获得预期的 json 文件。
现在我有另一个控制台应用程序试图从 webapp A 获取订单信息。代码如下:
String AUTHORITY = "https://login.microsoftonline.com/" + [tenant-id];
String ORDER_URL = "https://xxx.azurewebsites.net/appA/order/1111"
ExecutorService service = Executors.newFixedThreadPool(1);
ClientCredential credentials = new ClientCredential([client-id], [client-secret]);
AuthenticationContext context = new AuthenticationContext(AUTHORITY, false, service);
Future<AuthenticationResult> future = context.acquireToken("https://graph.microsoft.com", credentials, null);
AuthenticationResult result = future.get();
String token = result.getAccessToken();
System.out.println(token);
HttpURLConnection conn = (HttpURLConnection) new URL(ORDER_URL).openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setRequestMethod("GET");
conn.setRequestProperty("Authorization", "Bearer " + token);
conn.connect();
int responseCode = conn.getResponseCode();
System.out.println(responseCode);
InputStream is = conn.getInputStream();
...
我可以获取令牌,但响应代码为 401,错误消息为 "You do not have permission to view this directory or page"。
那么我是否需要分配其他 API 权限才能使其正常工作?或者还有其他一些设置被遗漏了。
我可以重现您的问题,resource
应该是您要访问的应用程序的 client-id
或 Application ID URI
,而不是 MS 图 https://graph.microsoft.com
。