无法在节点服务器上创建会话

问题描述 投票:0回答:1

我正在尝试创建一个具有登录、注销、身份验证功能的节点服务器。我的代码有一些问题,在调试之后,生成了一些我无法理解或在谷歌上找不到的调试信息日志。

问题:

  1. 访问前需要身份验证的路由允许无需登录或 cookie 即可访问。
  2. 另外,登录后设置了cookie,但注销后cookie仍然存在。

调试信息:

  1. 当没有设置 cookie 并尝试访问 localhost:3000/

快速会话日志:

express-session 没有发送 SID,生成会话 +0ms

  1. 使用有效凭据发布 localhost:3000/login/password 时

快速会话日志:

express-session 没有发送 SID,生成会话 +0ms

express-session 没有发送 SID,生成会话 +3m

express-session set-cookie connect.sid=s%3AuQgx27XnqODttfCECNGsaeJLOWZhk04e.qnHVj9HmUs2svxtb4mb6R9xpw3imbf0kUEhOiRlNXr4;路径=/; HttpOnly +105ms

快速会话拆分响应 +9ms

快速会话获取 uQgx27XnqODttfCECNGsaeJLOWZhk04e +439ms

express-session session 发现 +8ms

快速会话触摸+5ms

快速会话拆分响应 +2ms

express-session touched +10ms

  1. 当发布 localhost:3000/logout

快速会话日志:

快速会话获取 uQgx27XnqODttfCECNGsaeJLOWZhk04e +2m

express-session session 发现 +4ms

快速会话保存 uQgx27XnqODttfCECNGsaeJLOWZhk04e +18ms

express-session set-cookie connect.sid=s%3ADEXRlWTn14GqFZU06YdLC-bemM8rn_ri.1v71XtDmg88F5brCD5yy3BsLvQ1UuGv%2FYS3vTeWD%2FUk;路径=/; HttpOnly +40ms

快速会话拆分响应 +6ms

快速会话获取 DEXRlWTn14GqFZU06YdLC-bemM8rn_ri +144ms

express-session session 发现+1ms

快速会话触摸+1ms

快速会话拆分响应 +1ms

express-session touched +2ms

我只是想了解这些概念,我知道我没有遵循良好的编码习惯。这是代码文件。

const express = require("express");
const app = express();
const doten = require("dotenv");
const bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: true }));
const courses = [
  { name: "aa", class: 5 },
  { name: "bb", class: 7 },
  { name: "cc", class: 8 },
  { name: "dd", class: 4 },
];
const user = [{}];
var passport = require("passport");
var LocalStrategy = require("passport-local");
var session = require("express-session");

passport.use(
  new LocalStrategy(function verify(username, password, cb) {
    if (username == 1 && password == 1) return cb(null, username);
    else return cb(null, false, { message: "Incorrect username or password." });
  })
);

app.use(
  session({
    secret: "keyboard cat",
    resave: false,
    saveUninitialized: false,
    cookie: { secure: false },
  })
);

app.use(passport.authenticate("session"));
passport.serializeUser(function (username, cb) {
  process.nextTick(function () {
    return cb(null, {
      username: username,
    });
  });
});

passport.deserializeUser(function (user, cb) {
  process.nextTick(function () {
    return cb(null, user);
  });
});

app.post(
  "/login/password",
  passport.authenticate("local", {
    successRedirect: "/",
    failureRedirect: "/login",
  })
);

app.get("/", (req, res) => {
  res.json({
    name: "Sourabh Roy",
    class: 9,
    section: "A",
    roll: 27,
    pass: "PASSED",
  });
});
app.get("/books/:name", (req, res) => {
  res.send({ ...req.params, ...req.query });
});

app.post("/signup", (req, res) => {
  let temp_user = req.body;
  console.log(req.body);
  user.push(temp_user);
  res.send(req.body);
});

app.post("/logout", function (req, res, next) {
  req.logout(function (err) {
    if (err) {
      return next(err);
    }
    res.redirect("/");
  });
});

//process.env.SERVER_PORT
app.listen(3000, (err) => {
  if (err) console.log("hi");
  else console.log("Server is up at port 3000");
});
node.js express passport.js express-session passport-local
1个回答
0
投票

您需要使用会话存储服务,因为当前会话存储在服务器端内存中,这会导致问题。

在我看来,您需要使用 redis 进行会话存储。这是一个你可以使用的模块https://www.npmjs.com/package/connect-redis

它也提到了连接 redis 和会话模块的细节。

© www.soinside.com 2019 - 2024. All rights reserved.