依赖 :‘cookie-parser’、‘express-session’、connect-redis、‘bycrypt’
一.cookie-parser ( Express的中间件,用来实现cookie的解析 )
cookie-parser是将cookie的值由字符串解析成对象的中间件,可以使用req.cookies查看cookies的值,
如req.cookies.name。 req.cookies这个属性是一个对象,包含请求发送的cookies。如果请求没有带
cookies, 那么其值为{}。
var cookieParser = require('cookie-parser' )
cookieParser(secret, options)
Secret: 可以用string 或是 array 来签名cookie;默认无。
Options: 第一部分中cookie的可选对象;
例
var cookieParser = require('cookie-parser');
app.use(cookieParser(String));
app.use()相当于每一次请求带上cookieParser(),初始化cookieParser,传入String 作为secreat的密匙加在cookie上类似于加密盐的作用,避免直观暴露在页面上。
**注:**传入签名和不传入签名的cookie获取方式不同
例
// 不采用签名形式获取cookie的方法
app.use(cookieParser());
res.cookie('bwf', '1234'); //设置cookie
res.send("欢迎第一次访问");
console.log(req.cookies);
// 使用签名获取cookie
app.use(cookieParser('singedMyCookie'));
res.cookie("bwf", "hhw", {signed: true}); // 创建加密cookie
res.send("欢迎第一次访问");
//(采用签名形式获取cookie的方法
console.log(req.signedCookies)
注:即使在创建cookieParser时(传入了secret字符串) , cookie也不会自动加密, 需要使用res.cookie(name, value , {singed: true}) 去创建加密的cookie, 以及使用req.signedCookies来获取解密后的cookie
二.Bcryptjs(避免数据库中数据泄露加密存进去的字符串)
我采用的异步加密,还有很多种方式不一一列举
hash加密
var bcrypt = require('bcryptjs');
// 设置加密程度
var salt = bcrypt.genSaltSync(10);
// value为加密的值
bcrypt.hash('value',salt,(err,verify) => {
if(err){
return
}
// verifyValue为加密好的字符串可以存进数据库
return verifyValue
})
hash验证取出的加密值
// 第一个参数为传入的值,第二个是hash加密的值
bcrypt.compare("value", verifyValue, (err, rt) => {
if (err) {
console.log(err)
}
// rt为true or false
console.log(rt)
})
三.connect-redis
这是一个关于session的持久化插件, 配合 express-session使用。此模块基于redis,将session相关信息持久化。根据express的文档,我们只要实现其所要求的部分方法即可。
例
var session = require("express-session");
var RedisStore = require('connect-redis')(session);
var cookieParser = require('cookie-parser');
注: session放置在RedisStore前传参将session存入Redis,不然会异常
四.express-session
session参数
var session = require("express-session");
app.use(session(option))
secret:一个String类型的字符串,作为服务器端生成session的签名,若配置了cookiePaeser(secreat)要一致,不然可能出问题
name:返回客户端的key的名称,默认为connect.sid,也可以自己设置。
resave:是指每次请求都重新设置 session cookie,假设你的 cookie 是 10 分钟过期,每次请求都会再设置 10 分钟。默认为true。
saveUninitialized:是指无论有没有 session cookie ,每次请求都设置个 session cookie ,默认给个标示为 connect.sid。
**cconsion ID cookie 的设置对象,设置返回到前端key的属性,默认值为{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }。
store: 存储session(文本文件、redis等)
例
// session相关配置
app.use(session({
secret: config.pass_secret, // cookie-parser 的 secret 不一致时,可能出问题
store: new RedisStore(config.redis),
saveUninitialized: false,
resave: false, //指每次请求都重新设置 session cookie,假设你的 cookie 是 10 分钟过期,每次请求都会再设置 10 分钟。默认为true。
cookie: {
httpOnly: false,
// expires: false,
maxAge: 10 * 60 * 10000,
},
}));