• node 第十八天 中间件express-session实现会话密钥


    1. express-session 文档
      express-session 一个简单的express会话中间件

    2. 使用场景
      在一个系统中, 需要维持一个临时的与登录态无关的会话密钥
      比如登录系统后, 请求某一个接口, 接口的行为与登录态无关, 也就是说任何人对接口的访问都是一样的,服务端不关心客户端是谁, 但是为了服务特定用户(比如能够登录该系统的用户),又必须有一个密钥来做验证,请求密钥时验证用户的登录状态,验证成功, 则发送密钥。 用户拿到密钥后就可以和服务端通信, 而通信过程不需要带上用户信息, 服务端也不会关心用户信息。

    3. 使用
      node

      const session = require('express-session');
      app.use(
        session({
          secret: 'myscret',
          resave: false,
          saveUninitialized: true,
          name: 'token'
        })
      );
      //服务端设置会话密钥,发送给客户端加密后的密钥
      //虽然接口叫做login其实和登录没有联系
      router.post('/login', (req, res, next) => {
        req.session.token = '10086';
        res.send(200, {
          msg: 'ok'
        });
      });
      //需要会话密钥验证的接口
      router.post('/request', (req, res, next) => {
        console.log(req.session);
        if (req.session.token && req.session.token === '10086') {
          res.send(200, {
            msg: 'get'
          });
          return;
        }
        res.send(200, {
          msg: 'error reject'
        });
      });
      //服务端销毁会话密钥
      router.post('/logout', (req, res, next) => {
        req.session.destroy(() => {
          res.send({
            msg: 'logout'
          });
        });
      });
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
    4. 其实这种场景比较少, 大多数的场景还是需要对用户的状态做出区分, 而且关联上用户状态也是可以涵盖这种场景的

    5. 使用注意, 如果前后端跨域 【注释一】 你需要注意, 跨域如何设置cookie(如果你读过文档, 你会知道这个中间件是基于cookie实现的)已经在node第十一天说过。
      在这里插入图片描述
      这是mdn的文档描述, 但是你无法在本地跨域的情况下使用使用这个中间件, 因为此中间件对于跨域设置cookie会忽略掉,即使是 locahost 。从规范的角度来说这里应该是这个中间件的不足之处

    6. 【注释一】 这里的跨域准确来说应该是至少域名/ip存在不同,而不能仅仅是端口号不同

    7. 这种会话模式显然是将凭证维护在服务端, 与之对应的还有另外一种方式, 也就是现在被广泛运用的token,把凭证维护在客户端。详见node 第十九天

  • 相关阅读:
    08 SQL优化
    MIT6.824 Spring2021 Lab 1: MapReduce
    MySQL (2)
    Java 超新星开源项目 Solon v1.10.10 发布
    IDEA小技巧:Markdown里的命令行可以直接运行了
    集合学习笔记——Collection 全家桶
    Flutter高仿微信-第31篇-单聊-表情
    SQL transaction事物以及各种锁
    ubuntu20.04中安装配置docker nvidia容器来实现宿主机GPU的调用
    开发、部署系统环境 - docker 各常用镜像的使用
  • 原文地址:https://blog.csdn.net/weixin_43546457/article/details/134444948