如何在Node.js Azure Function中验证解析Azure AD Bearer Token实现RBAC
Azure Function(Node.js)验证Azure AD Bearer Token实现角色权限控制方案
1. 安装依赖
使用jsonwebtoken做JWT验证,jwks-rsa从Azure AD动态获取签名公钥:
npm install jsonwebtoken jwks-rsa
2. Azure Function 代码实现
以下是HTTP触发的Azure Function完整逻辑:
const jwt = require('jsonwebtoken'); const jwksClient = require('jwks-rsa'); // 替换为你自己的Azure AD配置 const AZURE_AD_CONFIG = { TENANT_ID: '62765715-2081-4050-bdc7-8c2e178d7424', // 你的租户ID CLIENT_ID: '0d42647a-183c-404b-bbe1-796ad6420989', // 你注册的应用客户端ID ISSUER: `https://login.microsoftonline.com/62765715-2081-4050-bdc7-8c2e178d7424/v2.0` // 与Token中的iss字段一致 }; // 初始化JWKS客户端,从Azure AD获取公钥 const client = jwksClient({ jwksUri: `https://login.microsoftonline.com/${AZURE_AD_CONFIG.TENANT_ID}/discovery/v2.0/keys` }); // 获取验证签名用的公钥 function getPublicKey(header, callback) { client.getSigningKey(header.kid, function (err, key) { const signingKey = key.getPublicKey(); callback(null, signingKey); }); } // Token验证方法 function validateToken(token) { return new Promise((resolve, reject) => { jwt.verify(token, getPublicKey, { issuer: AZURE_AD_CONFIG.ISSUER, audience: AZURE_AD_CONFIG.CLIENT_ID, algorithms: ['RS256'] }, (err, decoded) => { if (err) return reject(err); resolve(decoded); }); }); } module.exports = async function (context, req) { // 提取请求头中的Bearer Token const authHeader = req.headers.authorization; if (!authHeader || !authHeader.startsWith('Bearer ')) { context.res = { status: 401, body: '缺少有效授权凭证' }; return; } const token = authHeader.split(' ')[1]; try { // 验证Token合法性,解析Claims const decodedClaims = await validateToken(token); // 角色权限校验,判断是否包含所需角色 const requiredRole = 'content_manager'; if (!decodedClaims.roles || !decodedClaims.roles.includes(requiredRole)) { context.res = { status: 403, body: '权限不足,无法访问该接口' }; return; } // 角色校验通过,执行正常业务逻辑 context.res = { status: 200, body: { message: '验证通过', userInfo: { name: decodedClaims.name, username: decodedClaims.preferred_username, roles: decodedClaims.roles } } }; } catch (error) { // Token验证失败,比如过期、签名无效、发行方不匹配等 context.res = { status: 401, body: '授权凭证无效' }; } };
3. 关键说明
- 所有配置参数需要和你Azure AD注册应用的信息、返回Token中的对应字段保持一致,否则会验证失败
- 不要跳过签名、issuer、audience、有效期的验证,避免伪造Token的安全风险
- 如果你的应用支持多租户,需要调整issuer的校验规则,不要写死单租户的issuer地址
内容的提问来源于stack exchange,提问作者Ivan Koshelev
相关产品推荐
相关产品推荐

