Node.js 未将重定向 URL 保留在中间件中设置的会话变量中

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

app.js

const express = require('express');
const chalk = require('chalk');
const app = express();
const debug = require('debug')('app')
const path = require('path');
const morgan = require('morgan');
const passport = require('passport');
const cookieParser = require('cookie-parser');
const session = require('express-session');


const sessionRouter=require('./src/routers/routerSession');
const adminRouter = require('./src/routers/routerAdmin');
 const authRouter = require('./src/routers/routerAuth');
 const {
 saveOriginalUrl,
 ensureAuthenticated,
} = require("./src/config/middlewares");
  const PORT = process.env.PORT || 3000;

app.use(morgan('tiny'));
app.use(express.static(path.join(__dirname,'/public/')));
app.use(express.json());
app.use(express.urlencoded({extended:false}));
app.use(cookieParser());
app.use(
 session({
secret: "globomantics",
resave: false,
saveUninitialized: true, // Make sure to save uninitialized sessions
cookie: {
  secure: false, //setting this false for http connections
  maxAge: 3600000,
  expires: new Date(Date.now() + 3600000),
}, 
})
);

require('./src/config/passport.js')(app)

app.set('views','./src/views');
app.set('view engine','ejs')




app.use('/admin', adminRouter);
app.use('/auth',authRouter);

app.use("/sessions", saveOriginalUrl, ensureAuthenticated, sessionRouter);

中间件.js

function saveOriginalUrl(req, res, next) {
  console.log("saveOriginalUrl");
  if (!req.user && req.originalUrl) {
    console.log("Saving original URL:", req.originalUrl);
req.session.returnTo = req.originalUrl;
 }
 next();
}

 function ensureAuthenticated(req, res, next) {
   console.log("EnsureAuthenticated called, session:", req.session);
if (req.isAuthenticated()) {
  return next();
 }

 res.render("./signin"); // Redirect to login page if not authenticated
 }

  module.exports = {
   saveOriginalUrl,
   ensureAuthenticated,
 };

routerAuth.js

      authRouter
     .route("/signin")
     .get((req, res) => {

    res.render("signin");
   })
  .post(
      passport.authenticate("local", { failureRedirect: "/" }), // Only handle 
failureRedirect
(req, res) => {
  console.log("Session before redirect:", req.session);
  // After successful authentication, handle the redirect manually
  const redirectTo = req.session.returnTo || "/auth/profile"; // Default to "/auth/profile" if no returnTo
  console.log("Redirecting to:", req.session.returnTo);
  delete req.session.returnTo; // Clean up the session after redirecting
  res.redirect(redirectTo);
  }
 );

 module.exports = authRouter;

所以代码工作正常,除了我的会话变量是 redierctTo 在身份验证后未定义的 middleWares.js 中设置,并且我的页面被重定向到默认路径“auth/profile”我在这里做错了什么?

node.js http-redirect passport.js express-session
1个回答
0
投票

经过多次搜索并未能发布问题。我找到了一种基本方法来在 Passport.authenticate() 之后保留我的会话值。这就是我修改登录路线以实现它的方法。

authRouter
 .route("/signin")
 .get((req, res) => {
if (!req.session.returnTo) {
  req.session.returnTo = req.query.returnTo || "/auth/profile"; // Default value
}
console.log("Stored returnTo in session one:", req.session.returnTo);
res.render("signin");
})
.post(
(req, res, next) => {
  // Store returnTo in a local variable
  const returnTo = req.session.returnTo || "/auth/profile";
  req.session.returnTo = returnTo; // Ensure it's in the session too
  console.log("Session before authentication:", req.session.returnTo);

  // Save the value into res.locals to persist through Passport
  res.locals.returnTo = returnTo;

  next(); // Proceed to Passport authentication
},
passport.authenticate("local", { failureRedirect: "/" }), // Handle failure
(req, res) => {
  // After successful authentication, use res.locals.returnTo
  const redirectTo = res.locals.returnTo || "/auth/profile"; // Default to "/auth/profile"
  console.log("Redirecting to:", redirectTo);

  delete req.session.returnTo; // Optionally clean up the session after redirecting
  res.redirect(redirectTo);
}

);

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