如何为Node.js Azure Functions应用实现Azure AD身份验证与授权
Node.js Azure Functions 实现Azure AD身份验证与授权
前置配置
- 在Azure AD中注册Web API类型的应用,记录以下信息:
- 租户ID(Tenant ID)
- 客户端ID(Client ID)
- API受众(Audience,即你设置的API范围URI)
- 在Azure Functions应用的配置中添加以下环境变量:
AZURE_AD_TENANT_ID:你的Azure AD租户IDAZURE_AD_CLIENT_ID:注册的应用客户端IDAZURE_AD_AUDIENCE:API受众URI
依赖安装
执行命令安装Azure AD验证所需的库:
npm install @azure/msal-node
验证Token的辅助工具
创建authHelper.js文件,实现Token验证逻辑:
const { PublicClientApplication, ValidationParameters } = require('@azure/msal-node'); const msalConfig = { auth: { clientId: process.env.AZURE_AD_CLIENT_ID, authority: `https://login.microsoftonline.com/${process.env.AZURE_AD_TENANT_ID}` } }; const pca = new PublicClientApplication(msalConfig); async function validateBearerToken(req) { const authHeader = req.headers.authorization; if (!authHeader || !authHeader.startsWith('Bearer ')) { return { isValid: false, error: '缺少有效的Bearer Token' }; } const token = authHeader.split(' ')[1]; const validationParams = { audience: process.env.AZURE_AD_AUDIENCE, issuer: `https://login.microsoftonline.com/${process.env.AZURE_AD_TENANT_ID}/v2.0` }; try { const validationResult = await pca.validateIdToken(token, validationParams); return { isValid: true, claims: validationResult.claims }; } catch (error) { return { isValid: false, error: error.message }; } } module.exports = { validateBearerToken };
Azure Functions 示例代码
创建HTTP触发的函数(比如HttpTrigger/index.js),集成身份验证:
const { validateBearerToken } = require('../authHelper'); module.exports = async function (context, req) { // 验证Token const authResult = await validateBearerToken(req); if (!authResult.isValid) { context.res = { status: 401, body: { error: '未授权', details: authResult.error } }; return; } // Token验证通过,处理业务逻辑 context.res = { status: 200, body: { message: '访问成功', userInfo: { userId: authResult.claims.sub, userName: authResult.claims.name, email: authResult.claims.email } } }; };
注意事项
- 确保函数应用的环境变量已正确配置,且能被函数读取
- 若使用Azure AD v1.0端点,需调整
authority和issuer的格式(去掉/v2.0) - 可根据需求添加权限范围(Scope)的验证,在
validationParams中加入scopes字段
内容的提问来源于stack exchange,提问作者Bablu Ahmed
相关产品推荐
相关产品推荐

