在前端开发中,用户认证和授权是非常重要的功能,而 token 认证是目前最常用的一种认证方式。本文将介绍如何使用 Koa2 实现 token 认证中的 getToken、refreshToken 和 logout 功能。
什么是 token 认证
Token 认证是一种基于 token 的身份认证方式,其原理是客户端在登录后,服务器返回一个 token,客户端将该 token 存储在本地,之后的每次请求都需要携带该 token,服务器通过验证该 token 来判断用户的身份和权限。
Token 认证相比传统的 cookie/session 认证更加安全,因为它不需要在服务器端保存用户信息,只需要在客户端保存 token 即可。
实现 getToken 功能
getToken 功能是用户在登录后,服务器返回一个 token 的过程。实现该功能的步骤如下:
- 安装 koa-jwt 和 jsonwebtoken 模块
koa-jwt 模块用于验证 token,jsonwebtoken 模块用于生成 token。
npm install koa-jwt jsonwebtoken --save
- 创建路由
在路由中处理登录请求,如果用户名和密码验证成功,则生成 token 并返回给客户端。
// javascriptcn.com 代码示例 const jwt = require('jsonwebtoken'); const koaJwt = require('koa-jwt'); router.post('/login', async (ctx, next) => { const { username, password } = ctx.request.body; if (username === 'admin' && password === '123456') { const token = jwt.sign({ username }, 'secret', { expiresIn: '1h' }); ctx.body = { code: 0, message: '登录成功', token }; } else { ctx.body = { code: -1, message: '用户名或密码错误' }; } await next(); });
- 配置中间件
在中间件中使用 koa-jwt 模块验证 token,如果验证成功,则将解析后的 token 存储在 ctx.state.user 中,供后续中间件使用。
// javascriptcn.com 代码示例 const jwt = require('jsonwebtoken'); const koaJwt = require('koa-jwt'); app.use(koaJwt({ secret: 'secret' }).unless({ path: [/^\/login/] })); app.use(async (ctx, next) => { try { await next(); } catch (err) { if (err.status === 401) { ctx.status = 401; ctx.body = { code: -1, message: '未登录或登录已过期,请重新登录' }; } else { throw err; } } }); app.use(async (ctx, next) => { const { user } = ctx.state; if (user) { console.log(user.username); } await next(); });
- 测试 getToken 功能
使用 Postman 发送登录请求,如果用户名和密码验证成功,则返回以下结果:
{ "code": 0, "message": "登录成功", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNjIyNzI3MTM3LCJleHAiOjE2MjI3MzA3Mzd9.8iPwnzLc2Bd9XJhAe8mDxZBdLkDfFmBtJ8M8W_xmFzE" }
实现 refreshToken 功能
refreshToken 功能是在 token 过期后,使用 refresh token 重新生成一个新的 token 的过程。实现该功能的步骤如下:
- 修改生成 token 的代码
在生成 token 时,同时生成一个 refresh token,将其存储在数据库或缓存中。
// javascriptcn.com 代码示例 const jwt = require('jsonwebtoken'); const koaJwt = require('koa-jwt'); router.post('/login', async (ctx, next) => { const { username, password } = ctx.request.body; if (username === 'admin' && password === '123456') { const token = jwt.sign({ username }, 'secret', { expiresIn: '1h' }); const refreshToken = jwt.sign({ username }, 'secret', { expiresIn: '7d' }); // 将 refreshToken 存储在数据库或缓存中 ctx.body = { code: 0, message: '登录成功', token, refreshToken }; } else { ctx.body = { code: -1, message: '用户名或密码错误' }; } await next(); });
- 创建路由
在路由中处理 refreshToken 请求,如果 refreshToken 验证成功,则生成一个新的 token 并返回给客户端。
// javascriptcn.com 代码示例 const jwt = require('jsonwebtoken'); const koaJwt = require('koa-jwt'); router.post('/refreshToken', async (ctx, next) => { const { refreshToken } = ctx.request.body; try { const decoded = jwt.verify(refreshToken, 'secret'); const token = jwt.sign({ username: decoded.username }, 'secret', { expiresIn: '1h' }); ctx.body = { code: 0, message: '刷新成功', token }; } catch (err) { ctx.body = { code: -1, message: '刷新失败' }; } await next(); });
- 测试 refreshToken 功能
使用 Postman 发送 refreshToken 请求,如果 refreshToken 验证成功,则返回以下结果:
{ "code": 0, "message": "刷新成功", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNjIyNzI3MTM3LCJleHAiOjE2MjI3MzA3Mzd9.8iPwnzLc2Bd9XJhAe8mDxZBdLkDfFmBtJ8M8W_xmFzE" }
实现 logout 功能
logout 功能是用户退出登录的过程,该过程需要将客户端保存的 token 和 refresh token 都删除。实现该功能的步骤如下:
- 创建路由
在路由中处理 logout 请求,删除客户端保存的 token 和 refresh token。
const jwt = require('jsonwebtoken'); const koaJwt = require('koa-jwt'); router.post('/logout', async (ctx, next) => { // 删除客户端保存的 token 和 refresh token ctx.body = { code: 0, message: '退出成功' }; await next(); });
- 测试 logout 功能
使用 Postman 发送 logout 请求,如果删除成功,则返回以下结果:
{ "code": 0, "message": "退出成功" }
总结
本文介绍了如何使用 Koa2 实现 token 认证中的 getToken、refreshToken 和 logout 功能。通过本文的学习,读者可以掌握 token 认证的基本原理和实现方式,以及如何使用 Koa2 实现相关功能。同时,本文也提供了完整的示例代码,读者可以通过阅读和实践来加深对本文内容的理解和掌握。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/656d4474d2f5e1655d5919d0