java - 使用 Java 访问受 Azure Active Directory 保护的 Web 服务
问题描述
这是背景:
- 应用服务 A,使用 Tomcat 和 Springboot,提供 Web 服务端点。例如
https://xxx.azurewebsites.net/appA/order/1111
- webapp A 受 AAD 身份验证(快速配置)保护。在 AAD 中注册了一个应用程序(web-app)。web-app 的客户端 ID 是[client-id]。
- 客户端密码[client-secret]在 web-app 中创建。
- AAD 目录 ID 为[tenant-id]。
- 使用浏览器打开上面的网址。显示 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,并且错误消息是“您无权查看此目录或页面”。
那么我是否需要分配其他 API 权限才能使其正常工作?或者有一些其他的设置被遗漏了。
解决方案
推荐阅读
- java - 扩展一个类并重新定义一个最终变量
- c - 我要求 calloc 为 10 个字符分配内存,但它的 sizeof 返回 8
- typescript - 打字稿从对象数组中过滤键值
- jquery - bootstrap 4动态导航不显示窗格
- python - w1 -= learning_rate * grad_w1 :为什么这在 python 3.7 jupyterLab 中不可用?
- django - amazon S3 存储桶区域应该更靠近主机服务器还是客户端服务器?
- asp.net-core - Asp.Net Core odata 无法识别控制器中的 Get 操作方法
- mongodb - Add total count to grouped + summed data
- c# - COMException (0x80041004): 没有足够的内存来操作 Crystal Reports
- mongodb - 无法使用 app.patch 并出现错误 发送到客户端后无法设置标头