• home > webfront > server > koa >

    koa网站安全之koa-session:cookie和session认证与统一登录

    Author:zhoulujun Date:

    《koa网站安全之JWT鉴权详解》,token 现在非常流行,但是koa-session登录验证能做更多的事情,而且整体方案也更加成熟

    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 : 用于加密 cookiesigned 签名 为 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