多租户应用OAuth2授权码流获取的Access Token调用Azure API报401错误
你拿到的EwBYA8l6BAAURSN/FHlDW5xN74t6GzbtsBBeBUYAAZDe7JE/MPLoAi+Fr+1Xxq5eBe5N9l8Q+c4QjkY5PGEzRnBpPe7+v6h+PLdh1cceBQx+/JsB2QCrYSCt7x/zGsQAhwoY/格式的token不是针对Azure管理API的有效JWT令牌,这正是调用API返回401 InvalidAuthenticationToken错误的核心原因。
为什么会拿到这种格式的token?
你当前请求授权时的scope参数只包含了openid offline_access——这两个都是OpenID Connect身份验证相关的范围,用于获取用户身份信息和刷新令牌,但完全没有涉及Azure管理API的权限范围。Azure AD会根据你请求的scope返回对应类型的令牌:当scope不包含目标API的权限时,返回的是通用的持有者令牌(非JWT格式),这种令牌无法被Azure管理API识别和验证。
解决步骤
要获取能调用Azure管理API的有效JWT令牌,你需要做以下调整:
更新授权URL的scope参数
在原有的scope中添加Azure管理API的权限范围https://management.azure.com/user_impersonation,修改后的授权URL应为:https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=my_id&prompt=consent&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fauthorize&response_type=code&scope=openid+offline_access+https%3A%2F%2Fmanagement.azure.com%2Fuser_impersonation&state=17注意要对URL中的特殊字符进行正确编码,比如
https://management.azure.com/user_impersonation要编码成https%3A%2F%2Fmanagement.azure.com%2Fuser_impersonation。确认应用已配置正确的API权限
登录Azure门户,检查你的应用注册:- 转到“API权限”页面
- 确保已添加“Azure Service Management”的
user_impersonation权限 - 如果是多租户应用且需要管理员级别的访问,确保该权限已获得管理员同意
重新获取令牌并验证
使用更新后的授权URL重新发起授权流程,获取新的auth_code后请求token。此时拿到的access_token应该是标准的JWT格式(以eyJ0eXAiOiJKV1Qi...开头)。
你可以用JWT解码工具查看令牌内容,确认aud(受众)字段的值为https://management.azure.com——这是令牌针对Azure管理API的关键标识。用新令牌调用API
使用新的JWT格式access_token调用Azure管理API,此时应该能正常返回数据,不会再出现401错误。
补充说明
那种以Ew开头的非JWT令牌,通常是Azure AD针对旧版API(比如Azure AD Graph)或通用身份场景返回的,它的受众和权限范围与Azure管理API不匹配,因此无法被后者识别。只有当请求的scope包含目标API的权限时,Azure AD才会返回针对该API的JWT令牌。
内容的提问来源于stack exchange,提问作者Roman Alekseiev

