Azure AD应用注册OAuth问题:生成的JWT对应未授权资源
解决Azure AD Client Credentials令牌资源授权问题
看起来你遇到的核心问题是:使用client_credentials模式请求API1的令牌,但令牌对应的资源没有被消费者应用授权——这大概率是因为你混淆了用户委派权限和应用权限的区别,client_credentials模式只认应用权限,而你当前配置的是用户委派权限。
下面是具体的排查和修复步骤:
1. 明确权限类型的差异
client_credentials是应用级授权,不需要用户参与,权限直接授予给消费者应用本身;而你在消费者应用「必填权限」里添加的API1/API2权限,默认是用户委派权限(Delegated Permissions),这类权限是给用户使用的,不适用于client_credentials模式。
2. 为API1定义应用权限
首先需要在API1的应用注册里创建应用权限:
- 进入Azure AD的应用注册,找到API1
- 切换到「公开API」选项卡
- 点击「添加权限」→ 选择「我的API」→ 找到API1
- 在「应用权限」分类下,添加你需要的权限(如果没有,先点击「添加权限」→ 「创建自定义权限」来定义应用权限)
- 保存设置
3. 给消费者应用授予API1的应用权限
回到消费者应用的应用注册:
- 切换到「API权限」选项卡
- 点击「添加权限」→ 「我的API」→ 选择API1
- 切换到「应用权限」分类,勾选你需要的权限
- 点击「添加权限」后,必须点击**「授予管理员同意」**(应用权限必须经过租户管理员同意才能生效)
4. 验证令牌请求参数
确保你的token请求参数正确:
resource参数必须是API1的应用ID URI或者客户端ID(你当前用的API1-AppID是可行的,但要确认这个ID确实是API1的应用注册ID)- 完整的请求体应该是:
grant_type=client_credentials&client_id=你的消费者应用ID&client_secret=你的消费者应用密钥&resource=API1的应用ID/URI
5. 解析令牌确认权限
请求到令牌后,用jwt.ms解析它,检查两个关键字段:
aud(受众):必须等于你请求的resource值(API1的ID/URI)roles:应该包含你给消费者应用授予的API1应用权限
如果aud字段不对,检查resource参数是否正确;如果roles为空,说明应用权限没有被正确授予或管理员同意未生效。
内容的提问来源于stack exchange,提问作者API Geek
相关产品推荐
相关产品推荐

