【Express】登录鉴权

// app.js
const express = require("express");
const session = require("express-session");
const MongoStore = require("connect-mongo");
const app = express();

app.use(
  session({
  	name: "xxSystem",
    secret: "this is session", // 服务器生成 session 的签名
    resave: true,  // true 每次访问一个接口之后,过期时间就会重新计算
    saveUninitialized: true, // 强制为初始化的 session 存储,但是第一次登录前并没有数据(所以刚开始无效)
    cookie: {
      maxAge: 1000 * 60 * 10,// 过期时间,这里设置的 1h
      secure: false, // 为 true 时候表示只有 https 协议才能访问 cookie
    },
    rolling: true, //为 true 表示 超时前刷新,cookie 会重新计时; 为 false 表示在超时前刷新多少次,都是按照第一次刷新开始计时。
    store: MongoStore.create({
      mongoUrl: 'mongodb://127.0.0.1:27017/xx_session',  // 新创建一个数据库
      ttl: 1000 * 60 * 10 // 过期时间和 maxAge 保持一致
  }),

  })
);
// 设置中间件,session 过期校验
app.use((req,res,next)=>{
  // 排除 login 相关的路由和接口,否则会无线循环 login 的重定向,致页面崩溃
  if(req.url.includes("login")){
    next()
    return;
  }
  if(req.session.user){
      // 设置 session{},默认存在内存中
      // data 是指 login 接口返回的数据
      req.session.user = data[0];
      // 重新设置 session 保证更新过期时间 正常起作用
      req.session.mydate = Date.now()
      next();
  }else{
  	  // 这里会出现一个问题,因为一般是前端进行路由跳转
  	  // 在这里后端进行跳转,浏览器会阻止这种行为
   	  res.redirect("/login")   
   	  // 可以用如下方法解决:是接口->返回错误码;不是接口->重定向
   	  // req.url.includes("api")?res.status(401).send({ok:0}):res.redirect("/login")
  }
})

你可能感兴趣的:(Express,express)