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