在前面的文章中我们介绍了如何使用 Koa2 框架搭建前端服务,如何使用路由和控制器来构建 API 接口,并了解了如何使用中间件来解析请求体和响应体。在本文中,我们将探讨如何使用 Redis 存储和提取 session 和 Authorization 验证。
Redis 简介
Redis 是一个高性能的 key-value 数据库,常用于缓存、会话存储、排名等场景下。它支持数据持久化,并且支持多种数据结构,如字符串、列表、集合、哈希表和有序集合等。
在 Node.js 中,可以使用 ioredis 模块来连接 Redis 数据库并进行数据存储和提取操作。
实现 Redis 存储和提取 session
当用户登录后,我们需要在服务器端为其创建一个 session 并将其存储在 Redis 中。当用户再次访问网站时,服务器会检查用户的 session 是否存在,如果存在则会将其提取出来,否则用户需要重新登录。具体实现步骤如下:
- 安装 ioredis 模块:
npm install ioredis --save
- 在 app.js 中引入并配置 Redis 连接:
const Redis = require('ioredis') const redisClient = new Redis({ port: '6379', host: '127.0.0.1', password: 'yourpassword' })
- 创建 session 存储中间件:
const session = require('koa-session') const { v4: uuidv4 } = require('uuid') app.keys = ['your secret key'] // session 存储配置 const SESSION_CONFIG = { key: 'koa:sess', // cookie key (default is koa:sess) maxAge: 86400000, // cookie 的过期时间 httpOnly: true, // 只能在服务端访问 cookie signed: true, // 双重加密,防止客户端篡改 store: { async get(key, maxAge, { rolling }) { let res = await redisClient.get(`SESSION:${key}`) if (!res) return if (rolling) { await redisClient.expire(`SESSION:${key}`, maxAge / 1000) } return JSON.parse(res) }, async set(key, sess, maxAge, { rolling, changed }) { if (rolling || changed) { await redisClient.set(`SESSION:${key}`, JSON.stringify(sess), 'EX', maxAge / 1000) } return key }, async destroy(key) { return await redisClient.del(`SESSION:${key}`) } } } app.use(session(SESSION_CONFIG, app))
- 在登录成功后将用户的信息存储在 session 中:
router.post('/api/login', async (ctx) => { const { username, password } = ctx.request.body if (username === 'admin' && password === '123456') { ctx.session.user = { id: uuidv4(), username: 'admin' } ctx.body = { success: true, message: '登录成功!' } } else { ctx.body = { success: false, message: '用户名或密码错误!' } } })
- 在请求处理中获取用户的信息:
router.get('/api/userinfo', async (ctx) => { const user = ctx.session.user if (user) { ctx.body = { success: true, user } } else { ctx.body = { success: false, message: '请先登录!' } } })
实现 Redis 存储和提取 Authorization 验证
在前端开发中,通常需要进行用户身份验证和权限控制。我们可以使用 JWT(JSON Web Token)来实现用户身份验证和授权功能。
将 JWT 存储在 Redis 中的好处是可以快速验证 Token 是否合法,可以防止 Token 被篡改,也可以实现 Token 的撤销功能。具体实现步骤如下:
- 安装 jsonwebtoken 和 koa-jwt 模块:
npm install jsonwebtoken koa-jwt --save
- 在 app.js 中引入并配置 koa-jwt 中间件,用于解析 Authorization Header 中的 Token:
const jwt = require('koa-jwt') app.use(jwt({ secret: 'your secret jwt key', algorithms: ['HS256'] }).unless({ path: [/^\/api\/login/] }))
- 编写登录接口,并在登录成功后生成并返回 JWT:
const jwt = require('jsonwebtoken') const secret = 'your secret jwt key' router.post('/api/login', async (ctx) => { const { username, password } = ctx.request.body if (username === 'admin' && password === '123456') { const token = jwt.sign({ username }, secret, { expiresIn: '1h' }) ctx.body = { success: true, token } } else { ctx.body = { success: false, message: '用户名或密码错误!' } } })
- 在请求处理中验证 JWT 并获取用户信息:
router.get('/api/userinfo', async (ctx) => { const user = ctx.state.user ctx.body = { success: true, user } })
- 将 JWT 存储到 Redis 中:
const Redis = require('ioredis') const redisClient = new Redis({ port: '6379', host: '127.0.0.1', password: 'yourpassword' }) const setToken = async (username, token) => { await redisClient.set(`TOKEN:${username}`, token, 'EX', 3600) } const checkToken = async (username, token) => { const result = await redisClient.get(`TOKEN:${username}`) return result === token } router.post('/api/login', async (ctx) => { const { username, password } = ctx.request.body if (username === 'admin' && password === '123456') { const token = jwt.sign({ username }, secret, { expiresIn: '1h' }) await setToken(username, token) ctx.body = { success: true, token } } else { ctx.body = { success: false, message: '用户名或密码错误!' } } }) router.get('/api/userinfo', async (ctx) => { const { authorization } = ctx.header const [type, token] = authorization.split(' ') const { username } = jwt.verify(token, secret) const result = await checkToken(username, token) if (result) { ctx.body = { success: true, user: { username } } } else { ctx.body = { success: false, message: 'token 不合法!' } } })
总结
本文介绍了如何使用 Redis 存储和提取 session 和 Authorization 验证,希望读者能够理解和掌握这些技术,并在实际项目中应用到自己的前端开发工作中。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65ab26ccadd4f0e0ff4c31d2