在前端开发中,安全性是至关重要的,其中 token 鉴权是一种较为常见的验证方法。koa-jwt 是一个基于 Koa 的 token 认证中间件,可以方便快捷地实现 token 验证。
安装并使用 koa-jwt
通过 npm 安装 koa-jwt:
npm install koa-jwt --save
使用 koa-jwt 验证 token 的代码如下:
// javascriptcn.com 代码示例 const Koa = require('koa'); const jwt = require('koa-jwt'); const app = new Koa(); app.use(jwt({ secret: 'shared-secret' }).unless({ path: [/\/login/] })); app.use(async ctx => { ctx.body = 'Hello World'; }); app.listen(3000);
上述代码中,jwt
函数是 koa-jwt 的核心,secret
参数是用来对 token 进行签名的秘钥,unless
参数用于排除不需要验证的路由。
验证成功与失败的处理
在使用 koa-jwt 进行 token 验证时,有两种情况:验证成功和验证失败,分别进行不同的处理。
// javascriptcn.com 代码示例 const Koa = require('koa'); const jwt = require('koa-jwt'); const app = new Koa(); app.use((ctx, next) => { return next().catch(err => { if (err.status === 401) { ctx.status = 401; ctx.body = 'Token验证失败,请重新登录'; } else { throw err; } }); }); app.use(jwt({ secret: 'shared-secret' }).unless({ path: [/\/login/] })); app.use(async ctx => { ctx.body = 'Hello World'; }); app.listen(3000);
上述代码中,使用了 Koa 的错误处理中间件 app.use((ctx, next) => {});
来处理验证失败的情况。
应用实例
下面通过一个实例来演示如何在 Koa 中使用 koa-jwt 进行 token 验证。
首先,创建一个登录路由:
// javascriptcn.com 代码示例 app.use(async ctx => { if (ctx.url === '/login' && ctx.method === 'POST') { const { username, password } = ctx.request.body; if (username === 'admin' && password === 'admin') { const token = jwt.sign({ username }, 'shared-secret', { expiresIn: '1h' }); ctx.body = { message: '登录成功', token }; } else { ctx.status = 401; ctx.body = { message: '用户名或密码错误' }; } } });
上述代码中,判断请求的链接是否为 /login
以及请求的方法是否为 POST
,如果是,则校验用户名和密码是否正确,正确则使用 jwt.sign()
生成 token 返回给前端。
接着,使用 koa-jwt 验证其他路由的 token:
// javascriptcn.com 代码示例 app.use(async ctx => { if (ctx.url.startsWith('/api')) { await jwt({ secret: 'shared-secret' })(ctx, async () => { // 验证成功 await next(); }); } else { ctx.body = 'Hello World'; } });
上述代码中,判断请求的链接是否以 /api
开头。如果是,则使用 koa-jwt 进行验证。在验证成功后,执行相应的 API 逻辑,否则返回 401 错误。
最后,完整代码如下:
// javascriptcn.com 代码示例 const Koa = require('koa'); const Router = require('koa-router'); const bodyParser = require('koa-bodyparser'); const jwt = require('jsonwebtoken'); const app = new Koa(); const router = new Router(); app.use(bodyParser()); // 登录 app.use(async ctx => { if (ctx.url === '/login' && ctx.method === 'POST') { const { username, password } = ctx.request.body; if (username === 'admin' && password === 'admin') { const token = jwt.sign({ username }, 'shared-secret', { expiresIn: '1h' }); ctx.body = { message: '登录成功', token }; } else { ctx.status = 401; ctx.body = { message: '用户名或密码错误' }; } } }); // API app.use(async ctx => { if (ctx.url.startsWith('/api')) { await jwt({ secret: 'shared-secret' })(ctx, async () => { // 验证成功 await next(); }); } else { ctx.body = 'Hello World'; } }); // 获取用户信息 router.get('/api/userinfo', async ctx => { ctx.body = { username: 'admin', age: 18 }; }); app.use(router.routes()); app.listen(3000);
总结
koa-jwt 是 Koa 中的一个常用 token 认证中间件,可以轻松实现 token 验证。在具体使用中,需要注意处理验证成功和验证失败的情况。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653f0ba37d4982a6eb889d0a