首页 > 解决方案 > 从角度获取 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
    });
  }

但是遇到 CORS 问题... 在此处输入图像描述

标签: angularazurehttpazure-active-directory

解决方案


你不能这样做,因为 Azure AD 不允许你使用来自浏览器的客户端凭据流。他们需要允许您无法配置的跨域请求。

您无法执行此操作的安全原因有很多,您提到的最明显的一个是客户端密码对访问该页面的任何人都是可见的。此外,任何可以获取该页面文件的人都可以作为应用程序在 API 上执行操作,因此跟踪谁实际做了某事变得非常困难。

通常,当您因为用户不能做某事而需要作为应用程序做某事时,您让用户在前端进行身份验证,以他们的身份调用后端 API,API 授权用户,然后使应用程序-仅对目标 API 进行经过身份验证的调用。


推荐阅读