昨日我们说到了如何使用原生的nodejs实现cookie + session + redis制作登录验证,但原生实现起来毕竟太过于麻烦,而现在的node项目又多是基于express和koa框架开发的,所以我们今天就来说一下如何在express 和 koa 脚手架创建的项目中配置使用session实现登录验证
- 既然我们这里使用了express 和 koa 的脚手架创建项目,所以我们也有必要简单说一下他们的中间件机制和洋葱模型:
关于中间件,我对他的理解是: 它就好比是一调流水线,将整个node项目串联起来,当请求到来时,express 或者 koa 将请求抽离成一个request 和一个 response对象,然后在项目中传递,所以我们之前说到的express中的参数存在一个req 和 一个res, 除此之外还有一个next()参数,就与我们的洋葱模型有关了:
我们就以这张图为例, 没个中间件就是一个函数,当http请求到达时,从外层的函数开始,一层一层的往内层函数去执行,就好比是剥洋葱一样,一层一层往往里剥,直到指定到最里层后再一层一层的往外面执行返回出去。而这整个的流程就是使用next()的这个函数来串联起来的,举个简单的例子:
const express = require('express')
const app = express()
app.use((req, res, next) => {
console.log("请求到达,开始执行!")
next()
})
app.use("/api", (req, res, next) => {
console.log("进入到/api下,继续执行!")
next()
})
app.get("/api/login", (req, res, next) => {
console.log("路径:", req.url, "\n请求方式:", req.method, "结束" )
res.end("ok")
})
app.listen(3000)
- 我们执行以上代码后访问 localhost:3000/api/login 借口时,我们便可以得到以下的结果:
经过上面我们的中间件机制,我们只需要往express和koa脚手架项目中再引入处理session的中间件即可:
- express中处理session的中间件及其配置:
- 在express中我们使用express-session进行session 的配置,使用connect-redis对session和redis进行连接:
- 安装express-session 和 connect-redis : npm i express-session connect-redis --save
- 在脚手架的入口文件app.js文件中引入该插件:
const session = require('express-session)
const RedisStore = require('connect-redis')(session)
3. 使用redis插件创建redis客户端:
const redis = require('redis')
const conf = {
port: 6379,
host: "127.0.0.1"
}
const redisClient = redis.createClient(conf.port, conf.host)
redisClient.on('error', (err) => {
console.log(err)
})
module.exports = redisClient
4. 引入redis客户端连接, 配置session中间件:
const redisClient = require('./db/redis')
const sessionStore = new RedisStore({ // 实例化一个redisStore()作为session的存储
client: redisClient // 指定store为redis存储客户端
})
// express注册使用session中间件: 配置后每次使用http请求后就会有了这么一个session值
app.use(session({
secret: "CGX_#1084_", // session 加密的密匙
cookie: { // cookie的配置
path: '/', // cookie 的生效路径: 默认配置
httpOnly: true, // 限制客户端操作修改cookie值 : 默认配置
maxAge: 24 * 60 * 60 * 1000 // cookie的失效时间,这里设置为1天
},
store: sessionStore //sesison存储的store
}))
- 经过上述步骤的处理后,express-session便在执行后会往http请求的返回中写入cookie中一段connect.sid值,值是用我们的密匙经过express-session加密后的,同时我们也可以在路由中从req.session中获取到redis中存储的session的具体值以及设置session的值。 这样我们也就能够根据session值进行登录验证了,其原理实质还是和我们昨天使用原生的node实现的是产不多的.
- koa中处理session的中间件及其配置:
- 在koa中我们配置处理session以及连接redis是使用koa-generic-session 和 koa-redis实现的:
- 项目中安装插件: npm i koa-generic-session koa-redis --save
- 在app.js文件中移入该插件:
const session = require('koa-generic-session')
const redisStore = require('koa-redis')
3. 进行session配置:
// session配置
app.keys = ['CGX_#1084_'] // 类似于express中的secret,对session进行加密的密匙
app.use(session({
// 配置cookie
cookie: {
path: "/",
httpOnly: true,
maxAge: 24 * 60 * 60 * 1000
},
// 配置redis
store: redisStore({
all: '127.0.0.1:6379' // redis的端口配置: 在koa中直接在这里了store配置后就不用再做其他的redis客户端配置了,相比于express koa中显得可能也就更方便些
})
}))
- 由于在koa中没有将req和res拆分开来,而是都放到了ctx中,所以我们拿到session值可以使用ctx.session拿到我们的redis中存放的session值以及修改session值,这也就完成了koa中的登录验证了.
经过五天的node路,简单的node服务器搭建我们现在是有能力实现的了,但对于更多的复杂的逻辑操作还需要我们继续不断的深究。
之后我们将说到的是nodejs的cheerio模块实现爬虫,使用node中的RedLock模块实现node分布式锁