在 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