React Native调用Azure Logic App自定义API权限与范围配置问题
解决Azure自定义范围API调用401无效令牌问题
核心问题拆解
你碰到的问题根源在于令牌请求的范围格式错误,以及对Azure AD权限配置逻辑的混淆:
- 自定义范围必须用
{API应用ID URI}/{范围名称}的完整格式请求,不能只写范围名 - 移动端请求令牌时要同时包含Graph和自定义API的所有必要范围,不能遗漏
- 应用注册添加的API权限,若为租户级权限需完成管理员同意才能生效
具体修复步骤
1. 正确构造请求范围
移动端请求令牌时,要把所有需要的范围完整声明,包括Graph权限和自定义API范围,示例代码如下:
const scopes = [ "openid", "profile", "email", "offline_access", "User.ReadWrite.All", "api://{你的Logic App应用注册ID}/custom_scope_name" // 替换为你的自定义范围完整路径 ];
- 这里的
api://{Logic App应用注册ID}是你在应用注册「公开API」中设置的应用ID URI - 自定义范围必须用完整路径,否则Azure AD不会返回对应权限到令牌中
2. 验证应用注册权限配置
- 确认移动端应用注册的「API权限」里,已添加自定义API的委托权限(Delegated permissions)
- 若为租户内应用,点击「授予管理员同意」按钮,确保权限全局生效
- 检查自定义API的「公开API」设置:范围状态为「已启用」,且允许的受众包含你的移动端应用
3. 调试令牌内容
获取令牌后,用JWT解码工具(比如本地JWT解析库)查看scp字段:
- 若
scp中没有自定义范围,说明请求范围格式错误,或权限未被同意 - 确保
offline_access字段存在,这样才能获取有效刷新令牌维持会话
4. 检查Logic App授权配置
- 确认Logic App的Azure AD授权策略中,允许的范围包含你定义的自定义范围
- 检查Logic App触发器是否正确验证令牌的
scp字段,确保权限匹配
对你两种尝试方案的修正
- 方案1问题:你只添加了自定义范围,未包含
openid、profile等必需范围及Graph权限,导致令牌缺少对应权限,自然无法调用Graph和获取刷新令牌 - 方案2问题:你未在请求范围中指定自定义API的完整路径,Azure AD不会自动添加该范围到令牌,因此调用API时返回401
内容的提问来源于stack exchange,提问作者Eduard Farkaš
相关产品推荐
相关产品推荐

