koa网站安全之koa-session:cookie和session认证与统一登录
Author:zhoulujun Date:
《koa网站安全之JWT鉴权详解》,token 现在非常流行,但是个人还是偏向浏览器cookies与session认证。那些禁止cookies与禁止JS,让他喝西北风去吧-稳定成熟的方案就是开发少掉头发(之前php、java )
koa-session实际上是通过cookie来保存信息的。koa-session在服务器上生成一个信息,通过加密后,以cookie的形式发送到用户的浏览器,在用户浏览器上可以看到是一个加密的cookie字段。
koa怎么实现的,可以看这个:https://github.com/zyl1314/blog/issues/3
怎么在项目中使用,官方其实以及提供了案例:https://github.com/koajs/session
在app.js中使用koa-session
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const session=require('koa-session');
const app = new Koa();
app.keys = ['this is my secret and fuck you all'];//我理解为一个加密的密钥
app.use(session({
key: 'koa:sess', /** cookie的名称,可以不管 */
maxAge: 7200000, /** (number) maxAge in ms (default is 1 days),cookie的过期时间,这里表示2个小时 */
overwrite: true, /** (boolean) can overwrite or not (default true) */
httpOnly: true, /** (boolean) httpOnly or not (default true) */
signed: true, /** (boolean) signed or not (default true) */
},app));
app.use(bodyParser());
具体参数说明如下:
app.keys : 用于加密
cookie
,signed
签名 为true
时必填 !!! 数组中如果多于一个项, 则会用于密钥轮换。key : cookie 中
sessionId
的格式, 默认koa.sess
maxAge : session 最大存活周期, 单位 ms, 默认一天。
autoCommit : 默认
true
, 自动将session
及sessionid
提交至header
返回给客户端。 当触发manuallyCommit
时失效。overwrite : 默认
true
, 是否允许重写。httpOnly : 默认
true
, 防止XSS攻击, 防止恶意脚本代码劫持session
。signed : 默认
true
, 会自动给cookie加上一个sha256的签名, 防止篡改和伪造Cookie
。rolling : 默认
false
, 每次响应刷新session
有效期。renew : 默认
false
, 在session
过期时刷新有效期。secure : 默认
false
, 只在 https 中传输。sameSite : 默认
null
, 不设置
定义登录的路由
module.exports = {
'POST /login': async (ctx, next) => {
var username= ctx.request.body.username;
var password = ctx.request.body.password;
if (username=='123'&&password==='123') {
//保存登录状态,这句代码会在浏览器中生成一个cookie
ctx.session.user = username;
ctx.body = { success: true, msg: '登录成功!' };
}
else{
ctx.body = { success: false, msg: '账号或密码错误!' };
}
}
};
退出登录
module.exports = {
'GET /logout': async (ctx, next) => {
// 将登录信息清空
ctx.session = null;
// 跳转到登录页或网站首页
ctx.response.redirect('/');
}
};
koa-router代码:
// ----- router/user.js -----
router.post('/login',
allowCORS,
login
);
router.post('/logout',
allowCORS,
loggedCheck,
async (ctx, next) => {
ctx.session = null;
ctx.body = new SuccessModel("退出成功");
}
)
// ----- controller/user.js
const crypto = require('crypto'); // 加密模块
const userModel = require('../models/userModel'); // mongoDB 数据模型
const { SuccessModel, ErrorModel } = require('../utils/resModel'); // 答复模型
async function login (ctx, next) {
const hash = crypto.createHash("sha256", "MY_SECRET_KEY");
const {username: name, password: pswd} = ctx.request.body;
const res = await userModel.findOne({username:name, password: hash.update(pswd).digest("hex")});
if (res) {
console.log(ctx.session.isNew)
let n = (ctx.session.views || 0);
ctx.session.views = n++;
ctx.body = new SuccessModel( "登录成功", ctx.session.view);
ctx.response.status = 200;
} else {
ctx.body = new ErrorModel("登陆失败");
ctx.response.status = 401;
}
}
参考文章:
Koa2 中如何使用 koa-session 进行登陆状态管理? https://juejin.cn/post/6948780829921247269
Node.js中Koa2如何使用Session完成登录状态保持? https://segmentfault.com/a/1190000019086415
转载本站文章《koa网站安全之koa-session:cookie和session认证与统一登录》,
请注明出处:https://www.zhoulujun.cn/html/webfront/server/koa/8968.html