基于Azure的前后端Microsoft AD身份认证实现方案咨询
解决Azure App Service后端AD认证下的前端API调用问题
核心逻辑
后端启用Microsoft AD认证后,会拦截所有未携带有效OAuth 2.0访问令牌的请求。令牌必须包含后端AD应用的权限范围,且受众(aud声明)需匹配后端应用的Client ID,后端才会验证通过并放行。
前端需发送的内容与传递方式
- 必填内容:从Microsoft Identity Platform获取的、针对后端AD应用的JWT格式访问令牌
- 传递方式:通过HTTP请求的
Authorization请求头传递,格式为Bearer <你的访问令牌>
Node.js + Axios 具体实现
1. 获取访问令牌
使用@azure/msal-node库完成用户登录并获取目标令牌(以授权码流为例,适配前后端分离场景):
const { PublicClientApplication } = require('@azure/msal-node'); // 前端AD应用配置 const msalConfig = { auth: { clientId: '<前端应用的Client ID>', authority: 'https://login.microsoftonline.com/<你的租户ID>', } }; const pca = new PublicClientApplication(msalConfig); async function getBackendAccessToken() { const tokenRequest = { // 后端应用的权限范围,格式为api://<后端Client ID>/<权限名称>(比如user_impersonation) scopes: ['api://<后端应用的Client ID>/user_impersonation'], code: '<用户登录后返回的授权码>', redirectUri: '<前端应用的回调地址>' }; const tokenResponse = await pca.acquireTokenByCode(tokenRequest); return tokenResponse.accessToken; }
2. Axios请求携带令牌
拿到令牌后,在API调用中添加Authorization头:
const axios = require('axios'); async function callProtectedBackendApi() { const accessToken = await getBackendAccessToken(); try { const response = await axios.get('<后端API的完整地址>', { headers: { 'Authorization': `Bearer ${accessToken}` } }); console.log('API返回结果:', response.data); } catch (error) { console.error('调用失败:', error.response?.data || error.message); } }
关键配置检查点
- 前端AD应用已在Azure AD中添加对后端应用的API权限,并完成管理员同意
- 令牌请求的
scopes参数必须与后端应用暴露的权限一致 - 后端应用的认证设置中,已将前端应用添加为允许的客户端(或启用“允许所有组织账户”)
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

