添加Sites.Read.All后JWT受众与范围变更,需兼容Graph API
问题场景
我的应用采用MSAD登录,原本通过自定义API权限获取令牌,为调用Microsoft Graph API访问SharePoint数据,在登录范围中添加了Sites.Read.All后,JWT令牌的受众(aud)和权限范围(scp)发生变更。需要保留原有的受众与权限范围配置,同时确保能正常调用Microsoft Graph API。
旧登录配置
issuer: 'https://login.microsoftonline.com/7xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxd5/v2.0', clientId: '83xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxbb', redirectUrl: 'msauth.com.application.redirect://auth/', additionalParameters: { prompt: 'login' }, scopes: [ 'openid', 'profile', 'email', 'offline_access', 'api://8xxxxxxx-xxx-xxxxxxxxxb/application.read', // 自定义API受众范围 ], androidAllowCustomBrowsers: ['chrome'],
旧JWT令牌解码内容
"aud": "api://8xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxbb", "scp": "application.read",
新登录配置(添加Graph权限后)
issuer: 'https://login.microsoftonline.com/7xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxd5/v2.0', clientId: '83xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxbb', redirectUrl: 'msauth.com.application.redirect://auth/', additionalParameters: { prompt: 'login' }, scopes: [ 'openid', 'profile', 'email', 'offline_access', 'Sites.ReadWrite.All', // 添加的Graph权限 'api://8xxxxxxx-xxx-xxxxxxxxxb/application.read', // 自定义API受众范围 ], androidAllowCustomBrowsers: ['chrome'],
新JWT令牌解码内容
"aud": "0000xxxxx-xxxx-xxxx-xxxx-xxxxxxx00000", // 变为Microsoft Graph的受众ID "scp": "email openid profile SharePointTenantSettings.Read.All Sites.Read.All Sites.ReadWrite.All User.Read",
解决方法
问题核心原因:当同一个登录请求混合自定义API权限和Microsoft Graph权限时,Azure AD会自动将令牌受众切换为Microsoft Graph(全局API优先级高于自定义API)。要同时满足两个需求,需分两次获取令牌:
获取自定义API专用令牌:保持原有登录范围不变,只请求自定义API和OIDC基础权限(
openid、profile等),得到的令牌aud仍为你的自定义API,scp保留application.read。单独获取Graph专用令牌:利用首次登录拿到的
offline_access刷新令牌,单独向Azure AD令牌端点发起请求,指定scope为https://graph.microsoft.com/Sites.ReadWrite.All offline_access(需带上Graph的完整前缀),此时得到的令牌受众为Microsoft Graph,权限包含所需的Graph接口权限。
关键注意事项
- 两个令牌独立使用:自定义API令牌用于访问你的后端服务,Graph令牌仅用于调用Microsoft Graph接口。
- 确保Azure AD应用注册中,已同时配置自定义API权限和Microsoft Graph权限(委派权限需完成管理员同意步骤)。
内容的提问来源于stack exchange,提问作者Mrinal Maheshwari
相关产品推荐
相关产品推荐

