如何仅从AAD获取id_token?Angular应用需获取用户身份信息
解决AAD隐式流获取id_token的资源参数问题
这个问题其实是因为你用了AAD v1.0的授权端点,并且对隐式流中resource参数的作用理解有偏差,我来一步步帮你搞定:
为什么会出现这些错误?
- 当你把
resource设为自己Angular应用的clientId时,AAD会判定你要请求访问这个clientId对应的受保护资源,但你的应用注册里并没有给自己配置访问权限,所以触发了AADSTS65005错误。 - 而v1.0的授权端点确实强制要求
resource参数,但这里的resource是指你要访问的后端API标识符,可你并没有后端,只是想获取用户身份,这时候v1.0端点就不太适配你的场景了。
正确的解决方案:切换到AAD v2.0授权端点
AAD v2.0端点专门优化了单页应用(SPA)的登录场景,它不需要resource参数,而是通过scope来声明你需要的用户信息和权限。
正确的授权请求示例
https://login.microsoftonline.com/{{MY-TENANT-HERE}}/oauth2/v2.0/authorize?response_type=id_token&client_id={{CLIENTID-HERE}}&state={{STATE-HERE}}&redirect_uri={{REDIRECTURI-HERE}}&scope=openid profile email&nonce={{nonce-here}}
注意这里的端点路径是/oauth2/v2.0/authorize,并且完全去掉了resource参数。
确认你的应用注册配置
在Azure门户里检查以下配置,确保符合要求:
- 找到你的Angular应用注册,进入「认证」页面。
- 在「隐式授权和混合流」区域,勾选「ID令牌」选项(这是隐式流获取用户身份的必要配置)。
- 确认「重定向URI」已正确设置为你的Angular应用的回调地址(比如
http://localhost:4200/auth-callback)。
获取并解析用户信息
当用户完成登录后,AAD会把id_token返回给你的重定向URI。你可以:
- 使用官方的
@azure/msal-angular库来处理登录流程和令牌解析,这是最推荐的方式,能帮你避免手动处理JWT的坑。 - 如果你想手动解析,
id_token是一个JWT格式的令牌,解码后可以直接拿到name、email、preferred_username等用户身份声明,这些就是你需要的用户名等信息。
补充:如果一定要用v1.0端点?
如果因为某些原因必须使用v1.0端点,可以把resource参数设为00000002-0000-0000-c000-000000000000(这是旧版AAD Graph的资源ID),不过Microsoft现在更推荐使用v2.0端点和Microsoft Graph,所以还是优先考虑前者。
内容的提问来源于stack exchange,提问作者cobolstinks
相关产品推荐
相关产品推荐

