我在 Express 中存储 cookie 时遇到问题

问题描述 投票:0回答:1
const app = express();
app.use(
  cors({
    origin: "http://localhost:3005",
    credentials: true,
  })
);
app.use(cookieParser());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(
  session({
    secret: "TAMARA",
    resave: true,
    saveUninitialized: true,
    cookie: { secure: false },
  })
);

const users = {};

app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser((user, done) => {
  users[user.id] = user;
  session.user_id = user.id;
  done(null, user.id);
});

passport.deserializeUser((id, done) => {
  console.log("deserialize", id);
  const user = users[id];
  done(null, user);
});

passport.use(
  new GitHubStrategy(
    {
      clientID: id,
      clientSecret: secret,
      callbackURL: "http://127.0.0.1:3000/auth/github/callback",
    },
    function (accessToken, refreshToken, profile, cb) {
      users[profile.id] = profile;
      return cb(null, profile);
    }
  )
);

const http = require("http").createServer(app);

app.route("/auth/github").get(passport.authenticate("github"));

app.route("/auth/github/callback").get(passport.authenticate("github", { failureRedirect: "/" }), (req, res) => {
  console.log("req user id", req.user.id);
  req.session.user = req.user;
  req.session.user_id = req.user.id;
  res.redirect("http://localhost:3005");
});

function ensureAuthenticated(req, res, next) {
  console.log("ensureAuthenticated", req.isAuthenticated(), "session", req.session);
  if (req.isAuthenticated()) {
    return next();
  } else {
    res.status(401).json({ message: "Unauthorized" });
  }
}

app.route("/test").get(ensureAuthenticated, (req, res) => {
  res.json({ message: "Hello world" });
});

http.listen(3000, () => {
  console.log("Listening on port " + 3000);
});  

在前端,请求的形式非常简单

<div>
    <a href="/auth/github">Github</a>
</div>

 <button
        onClick={() => {
          fetch("/api/test", {
            method: "GET",
            credentials: "include",
          })
            .then((res) => {
              return res.json();
            })
            .then((data) => {
              console.log(data);
            });
        }}
      >
        Click
</button> 
// The way I set up a proxy  
export default defineConfig({
  plugins: [react()],

  server: {
    port: 3005,
    proxy: {
      "/api": {
        target: "http://localhost:3000",
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, ""),
      },
      "/auth": {
        target: "http://localhost:3000",
        changeOrigin: true,
      },
    },
  },
});

简而言之,express-session 似乎不存储数据。我已经尝试了中间件中的各种选项,但它不起作用。更详细一点:通过 GitHub 登录成功,我将该数据附加到 req.session,express-session 生成一个 cookie,该 cookie 找到浏览器的路径(console.log("cookie", req.cookies) 打印 cookie请求后;我了解到 cookie 不是在登录后立即存储在浏览器中,而是在请求受保护的路由后存储在浏览器中)。但是,在下一个请求中,我遇到了问题,并且没有 req.user 或 req.isAuthenticated()。谁能看出令人沮丧的问题是什么?

express cookies express-session
1个回答
0
投票

问题是我没有在 GitHub 设置中使用 http://localhost:3000,而是使用了 127.0.01。当我在 GitHub 和代码中将 127.0.01 替换为 localhost 时,一切都开始工作了。

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