如何在Azure SSO登录后获取可调用微软Azure接口的JWT令牌
Azure SSO登录后获取JWT的可行方案
你现有SSO流程未返回JWT,核心原因是身份验证请求未配置正确的权限范围(scope)和响应类型,按以下步骤操作即可拿到调用Azure API所需的JWT:
1. 提前完成应用权限配置
- 进入Azure AD应用注册页,找到你集成的自有应用,打开「API权限」页,添加目标Azure API对应的权限:调用Microsoft Graph就加
User.Read等对应权限,调用Azure资源管理API就加https://management.azure.com/user_impersonation权限,配置完成后按需授予管理员同意。
2. 调整SSO认证请求参数
修改现有SSO登录请求的两个核心参数:
- 响应类型(response_type):如果使用授权码流,设置为
code;如果使用隐式流,设置为id_token token,即可直接返回访问令牌(即JWT) - 权限范围(scope):必须包含目标Azure API的资源标识+对应权限,比如调用Graph就加
https://graph.microsoft.com/User.Read,调用Azure管理API就加https://management.azure.com/user_impersonation,同时保留原有openid profile email等基础SSO所需的scope即可。
3. 不同集成场景的获取方式
- 如果使用微软官方MSAL库集成SSO(推荐方案):登录完成后直接调用
acquireTokenSilent方法,传入对应scope即可拿到可用JWT,浏览器端JS示例代码如下:
const tokenRequest = { scopes: ["https://management.azure.com/user_impersonation"] }; msalInstance.acquireTokenSilent(tokenRequest) .then(response => { const jwtToken = response.accessToken; // 此处即可拿到JWT用于后续Azure API调用 }) .catch(error => { // 静默获取失败时触发交互获取逻辑 msalInstance.acquireTokenPopup(tokenRequest) .then(response => { const jwtToken = response.accessToken; }) })
- 如果是自行实现OIDC认证流:拿到授权码后,向Azure AD的token端点
https://login.microsoftonline.com/{租户ID}/oauth2/v2.0/token发起POST请求,携带授权码、client_id、client_secret、redirect_uri、grant_type=authorization_code以及对应scope,接口返回内容中的access_token字段就是你需要的JWT。
4. 可用性校验
拿到JWT后可自行解码校验payload中的aud字段,确认和目标Azure API的资源标识一致后,即可放在请求头Authorization: Bearer {JWT_TOKEN}中发起Azure API调用。
内容的提问来源于stack exchange,提问作者Mirko
相关产品推荐
相关产品推荐

