You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:09:01