Koa2 应用中如何使用 jwt 进行认证授权?

在 Web 开发中,认证和授权是非常重要的部分。在 Koa2 应用中,使用 jwt(JSON Web Token)可以很方便地进行认证和授权。本文将介绍如何在 Koa2 应用中使用 jwt 进行认证授权,并提供示例代码。

什么是 jwt?

jwt(JSON Web Token)是一种用于在网络上安全传输信息的开放标准(RFC 7519)。jwt 可以在用户和服务器之间传递信息,并且可以通过数字签名进行验证和信任。jwt 由三个部分组成:头部、载荷和签名。

  • 头部(Header):头部通常由两部分组成:令牌类型(jwt)和所使用的算法(例如 HMAC SHA256 或 RSA)。
  • 载荷(Payload):载荷包含了需要传输的信息,例如用户 ID、用户名等。载荷还可以包含其他元数据,例如过期时间、发行人等。
  • 签名(Signature):签名使用头部和载荷中的信息以及一个密钥来创建。签名可以确保在传输过程中不会被篡改。

Koa2 应用中使用 jwt 进行认证授权

在 Koa2 应用中使用 jwt 进行认证授权,需要安装以下两个 npm 包:

  • koa-jwt:用于验证 jwt。
  • jsonwebtoken:用于生成和解析 jwt。

安装方式:

npm install koa-jwt jsonwebtoken

接下来,我们将详细介绍如何在 Koa2 应用中使用 jwt 进行认证授权。

生成 jwt

在生成 jwt 前,需要先生成一个密钥,用于签名 jwt。可以使用以下代码生成一个随机的密钥:

const jwtSecret = require('crypto').randomBytes(64).toString('hex');

生成密钥后,就可以使用 jsonwebtoken 包中的 sign() 方法生成 jwt。示例代码如下:

const jwt = require('jsonwebtoken');
const jwtSecret = require('crypto').randomBytes(64).toString('hex');

// 生成 jwt
const payload = { userId: 123 };
const token = jwt.sign(payload, jwtSecret, { expiresIn: '1h' });

以上代码中,payload 是需要传输的信息,jwtSecret 是密钥,expiresIn 是过期时间。

验证 jwt

在 Koa2 应用中,可以使用 koa-jwt 包中的 middleware() 方法验证 jwt。示例代码如下:

const Koa = require('koa');
const jwt = require('jsonwebtoken');
const koaJwt = require('koa-jwt');

const app = new Koa();
const jwtSecret = require('crypto').randomBytes(64).toString('hex');

// 中间件,验证 jwt
app.use(koaJwt({ secret: jwtSecret }).unless({ path: ['/login'] }));

// 路由,验证成功后返回用户信息
app.use(async (ctx, next) => {
  if (ctx.state.user) {
    ctx.body = { userId: ctx.state.user.userId };
  } else {
    ctx.status = 401;
    ctx.body = { message: '未授权' };
  }
});

app.listen(3000, () => {
  console.log('Server is running at http://localhost:3000');
});

以上代码中,koaJwt({ secret: jwtSecret }) 中间件用于验证 jwt,unless({ path: ['/login'] }) 用于排除 /login 路由不需要验证 jwt。路由中,如果验证成功,返回用户信息,否则返回未授权的信息。

解析 jwt

在 Koa2 应用中,可以使用 jsonwebtoken 包中的 verify() 方法解析 jwt。示例代码如下:

const Koa = require('koa');
const jwt = require('jsonwebtoken');
const koaBody = require('koa-body');
const router = require('koa-router')();

const app = new Koa();
const jwtSecret = require('crypto').randomBytes(64).toString('hex');

// 路由,解析 jwt
router.post('/login', koaBody(), async (ctx, next) => {
  const { username, password } = ctx.request.body;

  // 验证用户名和密码
  if (username === 'admin' && password === '123456') {
    // 生成 jwt
    const payload = { userId: 123 };
    const token = jwt.sign(payload, jwtSecret, { expiresIn: '1h' });

    ctx.body = { token };
  } else {
    ctx.status = 401;
    ctx.body = { message: '用户名或密码错误' };
  }
});

// 路由,验证 jwt
router.get('/user', async (ctx, next) => {
  const authorization = ctx.headers.authorization;
  const token = authorization.split(' ')[1];

  try {
    const decoded = jwt.verify(token, jwtSecret);
    ctx.body = { userId: decoded.userId };
  } catch (err) {
    ctx.status = 401;
    ctx.body = { message: '未授权' };
  }
});

app.use(router.routes());

app.listen(3000, () => {
  console.log('Server is running at http://localhost:3000');
});

以上代码中,/login 路由用于生成 jwt,/user 路由用于验证 jwt。在 /user 路由中,从请求头中获取 jwt,然后使用 verify() 方法解析 jwt。如果解析成功,返回用户信息,否则返回未授权的信息。

总结

本文介绍了在 Koa2 应用中如何使用 jwt 进行认证授权。具体来说,需要安装 koa-jwt 和 jsonwebtoken 两个 npm 包,然后使用 sign() 方法生成 jwt,使用 middleware() 方法验证 jwt,使用 verify() 方法解析 jwt。希望本文对大家学习 Koa2 应用中的认证授权有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658a8086eb4cecbf2dfb3f8b


纠错
反馈