如何使用user_impersonation范围通过Azure REST API获取用户配置信息
首先校准核心规则认知:Azure AD 签发的访问令牌是单资源受众绑定的,单个令牌的aud(受众)声明只能对应一个API资源,同个资源下可以包含多个委托权限scope,但跨资源的scope无法合并到同一个令牌中。你当前持有的user_impersonation范围令牌是签发给你自定义API的,确实无法直接调用受众为Microsoft Graph的原生用户接口,也不存在适配自定义API受众的官方公开用户信息GET接口,按以下两个路径实现即可,全程不需要调整客户端现有user_impersonation的scope请求逻辑:
方案1:直接解析现有令牌内置声明,获取基础用户配置
你当前拿到的user_impersonation范围访问令牌本身就内置了登录用户的基础profile字段,不需要额外发起接口请求:
直接对JWT格式的access token做验签解码(后端场景必须验签,前端纯信息展示可直接解码payload段),提取内置声明即可拿到常用用户信息:oid:用户在当前Azure AD租户下的唯一对象IDpreferred_username:用户登录账号(通常为邮箱格式)name:用户显示名称given_name:用户名family_name:用户姓氏email:用户预留邮箱(租户配置下发该声明时存在)
解码JWT可直接使用通用JWT工具库实现,不需要额外调用Azure或Graph相关接口。
方案2:后端通过OBO代表流代理请求Graph接口,获取完整用户配置
如果你需要的用户信息超出令牌内置声明范围(比如部门、职位、办公地点、用户头像、联系方式等扩展属性),不需要客户端调整权限请求逻辑,在你自定义API后端增加代理逻辑即可:- 客户端保持现有逻辑不变,携带
user_impersonation范围的access token请求你自定义API的用户信息查询接口 - 你的API后端拿到客户端传入的access token后,调用Azure AD令牌签发端点,通过OBO流申请Microsoft Graph的访问令牌,请求参数中指定scope为
https://graph.microsoft.com/User.Read,同时传入你的API客户端凭据、以及客户端上传的user_impersonation令牌作为用户断言 - 拿到Graph访问令牌后,由后端发起GET请求调用
https://graph.microsoft.com/v1.0/me接口,拉取完整用户配置文件 - 后端对返回的用户信息做字段裁剪/格式处理后,响应给前端即可
整个流程对客户端完全透明,客户端全程只需要申请原有user_impersonation范围的令牌,不需要感知Graph接口的存在。
- 客户端保持现有逻辑不变,携带
避坑提示:不要尝试在客户端直接携带自定义API的
user_impersonation令牌调用Microsoft Graph接口,这类请求一定会返回401未授权错误,本质是令牌受众不匹配,和scope配置无关,没有绕开该规则的公开接口。
内容的提问来源于stack exchange,提问作者Ajay Chauhan

