随着前端开发的发展,前后端分离的应用越来越普遍,为了保证应用的安全性和用户体验,我们通常需要采用 token 鉴权的方式来保护后端接口。在 koa2 中,koa-jwt 是一种常用的 token 验证中间件,它可以帮助我们快速、高效地实现 token 鉴权。本文将介绍 koa-jwt 的基本用法,并通过示例代码对其进行进一步说明。
什么是 koa-jwt
koa-jwt 是一个基于 jsonwebtoken 的 koa2 中间件,它可以对 token 进行验证并从中提取出用户数据,并将用户数据保存在请求的 state 中。它不仅可以验证 token 的有效性,还可以对 token 进行自定义验证,比如验证过期时间、Token 类型等。koa-jwt 的使用非常方便,只需要在需要验证 token 的路由前添加相应的中间件即可。
安装 koa-jwt
在开始使用 koa-jwt 之前,我们需要先安装它。可以通过 npm 在命令行中进行安装:
npm install koa-jwt
koa-jwt 基本用法
在 koa2 中使用 koa-jwt 验证 token 的基本流程如下:
- 引入 koa-jwt 和 jsonwebtoken:
const jwt = require('jsonwebtoken'); const koaJwt = require('koa-jwt');
- 配置 jwt 的密钥和其它参数:
const secret = 'your secret'; // jwt 密钥,可以随便设定 const expiresIn = '1h'; // token 过期时间
- 编写路由并添加 koa-jwt 中间件:
// javascriptcn.com 代码示例 router.get('/protected', koaJwt({ secret }), async (ctx, next) => { // 验证通过,可以在 state 中获取用户信息 const user = ctx.state.user; // 返回用户数据 ctx.body = { message: 'Hello, ' + user.name, data: user }; });
- 客户端向服务器端发送 jwt:
const token = jwt.sign({ name: 'Alice' }, secret, { expiresIn });
这样,当客户端向服务器发送请求 /protected
时,koa-jwt 中间件会对请求的 Authorization Header 中的 token 进行验证,如果验证通过,就会把 token 中加密的用户信息的数据存入请求的 state 中,我们可以通过 ctx.state.user 来获取这些信息,从而实现后端鉴权。
koa-jwt 高级用法
koa-jwt 不仅可以验证 token 的有效性,还可以对 token 进行自定义验证,比如验证过期时间、Token 类型等。通过自定义验证函数,我们可以在 token 验证之前添加一些额外的逻辑。
// javascriptcn.com 代码示例 const tokenType = 'Bearer'; router.get('/protected', koaJwt({ secret, getToken: ctx => ctx.headers['authorization'].split(' ')[1], // 指定从 Header 中获取 token 的方式 isRevoked: async (ctx, decodedToken, token) => { // 自定义验证过程,可以验证 token 类型和过期时间 if (decodedToken.type !== tokenType) { await setImmediatePromise(); // 等待异步函数 return true; } if (decodedToken.exp < Date.now() / 1000) { await setImmediatePromise(); return true; } return false; } }), async (ctx, next) => { const user = ctx.state.user; ctx.body = { message: 'Hello, ' + user.name, data: user }; }); function setImmediatePromise() { return new Promise(resolve => { setImmediate(() => { resolve(); }); }); }
在这个例子中,我们通过指定 getToken
函数来指定从 Header 中获取 token 的方式,通过 isRevoked
函数来自定义验证过程,验证完毕后将验证结果返回即可。这样,我们就可以定制化地验证 token,实现更加复杂的鉴权逻辑。
总结
koa-jwt 是一个非常好用的 token 验证中间件,它让我们能够快速、高效地实现 token 鉴权,并支持自定义验证逻辑。我们在实际应用中可以根据自己的需求,对它进行各种扩展和定制,以实现更加灵活和安全的应用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654830197d4982a6eb278d50