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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:13:17