在Azure Functions(Node.js)中调用JWT验证中间件的方法咨询
在Azure Functions中实现带JWT验证的Node.js CRUD API
Azure Functions 不像 Express 那样有完整的中间件链机制,没法直接用 app.use() 挂载 Express 风格的中间件。你得把JWT验证逻辑封装成独立的工具函数,在每个需要保护的API函数开头手动调用它。下面是完整的实现方案:
1. 安装必要依赖
先装需要的包:
npm install jsonwebtoken bcryptjs @azure/functions
2. 写登录接口(生成JWT)
创建 login/index.js,处理账号密码校验并返回JWT:
const { app } = require('@azure/functions'); const jwt = require('jsonwebtoken'); const bcrypt = require('bcryptjs'); // 模拟用户数据库,实际项目换成真实数据库 const mockUsers = [ { id: 1, username: 'demo', password: bcrypt.hashSync('demo123', 10) } ]; app.http('login', { methods: ['POST'], authLevel: 'anonymous', handler: async (request, context) => { try { const { username, password } = await request.json(); const user = mockUsers.find(u => u.username === username); if (!user || !bcrypt.compareSync(password, user.password)) { return { status: 401, body: JSON.stringify({ msg: '账号或密码错误' }) }; } // 生成JWT,密钥从环境变量取,别硬编码 const token = jwt.sign( { userId: user.id, username: user.username }, process.env.JWT_SECRET, { expiresIn: '1h' } ); return { status: 200, body: JSON.stringify({ token }) }; } catch (err) { return { status: 500, body: JSON.stringify({ msg: '服务器出错了' }) }; } } });
3. 封装JWT验证工具函数
新建 utils/jwtValidator.js,把验证逻辑抽出来复用:
const jwt = require('jsonwebtoken'); async function checkJwt(request) { const authHeader = request.headers.get('authorization'); if (!authHeader || !authHeader.startsWith('Bearer ')) { return { valid: false, msg: '请提供有效的Token' }; } const token = authHeader.split(' ')[1]; try { const decoded = jwt.verify(token, process.env.JWT_SECRET); return { valid: true, user: decoded }; } catch (err) { return { valid: false, msg: 'Token无效或已过期' }; } } module.exports = { checkJwt };
4. 写受保护的API(比如GET /basic-data)
创建 basicData/index.js,在函数开头调用验证函数:
const { app } = require('@azure/functions'); const { checkJwt } = require('../utils/jwtValidator'); // 模拟业务数据 const mockBasicData = [ { id: 1, title: '基础数据1', content: '内容1' }, { id: 2, title: '基础数据2', content: '内容2' } ]; app.http('basicData', { methods: ['GET'], authLevel: 'anonymous', // 这里设为匿名,因为我们自己做JWT验证 handler: async (request, context) => { // 先做JWT验证 const authResult = await checkJwt(request); if (!authResult.valid) { return { status: 401, body: JSON.stringify({ msg: authResult.msg }) }; } // 验证通过,返回数据 return { status: 200, body: JSON.stringify(mockBasicData) }; } });
5. 配置环境变量
在 local.settings.json 里添加JWT密钥(生产环境用Azure密钥保管库管理):
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node", "JWT_SECRET": "your-strong-random-secret-key" // 换成自己的强密钥 } }
注意点
- 不要把JWT密钥硬编码在代码里,必须用环境变量管理
- 密码一定要用bcrypt哈希后存储,绝对不能明文存
- Azure Functions的
authLevel必须设为anonymous,否则内置的认证会先拦截请求,我们的自定义验证就没机会跑了
内容的提问来源于stack exchange,提问作者Angret Hua
相关产品推荐
相关产品推荐

