Skip to content
On this page

koa-jwt

简介

koa-jwt 是一个用于处理 JSON Web Token (JWT) 的 Koa 中间件,它可以保护指定的路由,验证请求中的 JWT token,并将解码后的 payload 添加到 ctx.state.user 中。

安装

bash
npm install koa-jwt

基本使用

javascript
const Koa = require('koa');
const jwt = require('koa-jwt');

const app = new Koa();

// 配置 JWT 中间件
app.use(jwt({ 
  secret: 'your-secret-key' // 用于签名的密钥
}).unless({ 
  path: [/^\/public/, /\/login/] // 不需要验证的路由
}));

// 受保护的路由
app.use(async (ctx) => {
  // 验证通过后可以访问 ctx.state.user
  ctx.body = { user: ctx.state.user };
});

app.listen(3000);

配置选项

  • secret: 用于签名的密钥
  • key: 存储解码后的 token 的 ctx.state 的属性名,默认为 'user'
  • algorithms: 指定允许的签名算法,如 ['HS256']
  • issuer: token 的签发者
  • audience: token 的接收者
  • debug: 是否开启调试模式

错误处理

javascript
app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    if (err.status === 401) {
      ctx.status = 401;
      ctx.body = {
        error: 'Authentication Error',
        message: err.message
      };
    } else {
      throw err;
    }
  }
});

生成 Token

javascript
const jwt = require('jsonwebtoken');

// 登录路由
app.use(async (ctx) => {
  const { username, password } = ctx.request.body;
  
  // 验证用户名和密码
  if (username === 'admin' && password === 'password') {
    // 生成 token
    const token = jwt.sign(
      { username: 'admin', role: 'admin' },
      'your-secret-key',
      { expiresIn: '1h' }
    );
    
    ctx.body = { token };
  }
});

注意事项

  1. 确保使用安全的密钥,并妥善保管
  2. 合理设置 token 的过期时间
  3. 在生产环境中使用 HTTPS
  4. 注意路由的保护顺序,通常将 JWT 中间件放在其他业务中间件之前
  5. 建议使用环境变量存储密钥,而不是硬编码在代码中

要保持清醒 永远不抱有意外的幻想 凭空的期待最要命