angular - 从角度获取 AAD access_token 是否可行?
问题描述
我正在尝试从 Angular 获取 Azure 管理资源端点令牌,尽管我知道它在 clinet 端是易受攻击的。出于某种强有力的原因,我无论如何都在寻找这样做。
因为我可以通过运行此命令来获取 access_token。
curl -X GET -H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=client_credentials&client_id=<client-id>&resource=<management-resource-endpoint>&client_secret=<application-secret>' \
https://login.microsoftonline.com/<tenantid>/oauth2/token
我正在尝试将此命令转换为 http get request 之类的...
getAADToken() {
const param = new HttpParams();
param.append('grant_type', 'client_credentials');
param.append('client_id', <client-id>);
param.append('resource', '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d');
param.append('client_secret', <application-secret>);
return this.http.get<any>("https://login.microsoftonline.com/<tenantid>/oauth2/token", {
headers: new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded'),
params:param
});
}
解决方案
你不能这样做,因为 Azure AD 不允许你使用来自浏览器的客户端凭据流。他们需要允许您无法配置的跨域请求。
您无法执行此操作的安全原因有很多,您提到的最明显的一个是客户端密码对访问该页面的任何人都是可见的。此外,任何可以获取该页面文件的人都可以作为应用程序在 API 上执行操作,因此跟踪谁实际做了某事变得非常困难。
通常,当您因为用户不能做某事而需要作为应用程序做某事时,您让用户在前端进行身份验证,以他们的身份调用后端 API,API 授权用户,然后使应用程序-仅对目标 API 进行经过身份验证的调用。
推荐阅读
- python - python tkinter图像丢失
- java - 如何使用类似的字符串 HIBERNATE 数组
- python - 使用 python pandas 从原始 github 文件访问 CSV 数据
- python - Python 在达到调试点时退出,抛出“在已删除表上调用 Tcl_FindHashEntry”错误
- sql - 对(自定义)时间戳分区表的 BigQuery 查询返回零结果
- typescript - 如何测试一个 void async 函数是否成功与 jest?
- flutter - Flutter 升级错误:您对以下文件的本地更改将被覆盖
- python - 用 Python 中的链接抓取手机模型
- node.js - 如何使用 Bull 和 Node.js 通过后台作业处理函数?
- azure-devops - Azure Pipelines 构建可视化步骤而不是我的 .yml 文件