req.isAuthenticated() returns FALSE (express-session, passport-local)

req.isAuthenticated() returns FALSE (express-session, passport-local)

编辑:我通过将 app.use(session({...}))register.js 转移到 app.js[= 来设置 cookie 43=] 在我声明使用路由器之前 app.js。但是,问题 - req.isAuthenticated() 返回 false,仍然存在。

我正在尝试使用 passport-local、express-session 和 mongodb 为我的后端构建一个注册流程。

当我注册一个新用户时,它似乎工作正常,并且根据需要在我的数据库中创建了该用户。我还可以在 passport.authenticate() 回调 post 注册中访问 req.user。但是,当我使用 res.redirect() 重定向到新路线时,req.isAuthenticated() returns false 在我的新路线上。

检查浏览器中的 cookie 后,express-session 似乎从未按预期保存会话。我的本地主机没有 cookie。我已经做了数小时的研究,我遇到的大多数答案都与在初始化时仔细检查代码序列有关。我已经这样做了无数次,并尝试同时使用 passport.serializeUser(User.serializeUser());passport.serializeUser(function(user, done) { done(null, user.id); }); 来确保我正确地执行了该步骤。我似乎无法弄清楚为什么我会遇到这个问题。任何和所有帮助将不胜感激!我的代码中的相关片段 -

Register.js(路由器)

var express = require('express');
const session = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const passportLocalMongoose = require('passport-local-mongoose');
var router = express.Router();

const app = express();

app.use(bodyParser.urlencoded({extended: true}));

app.use(session({
  secret:"Edit Later.",
  resave:true,
  saveUninitialized:true
}));

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

const userSchema = new mongoose.Schema({
  name:String,
  username:String,
  contactNumber:String
});

userSchema.plugin(passportLocalMongoose);

passport.use(new LocalStrategy(User.authenticate()));


passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

router.post('/', function(req, res, next) {

  const reCaptchaKey = "<MYKEY>";
  var userCaptchaToken = req.body['g-recaptcha-response'];

  axios.post('https://www.google.com/recaptcha/api/siteverify', null, {params: {
    secret: reCaptchaKey,
    response: userCaptchaToken
  }}).then(response => {
    if (response.data.success === true) {

  User.register({username: req.body.username, name: req.body.fullName}, req.body.password, 
  function(err, user) {
        if (err) {
          console.log(err);
          // res.redirect('/views/register.html');
        } else {
          passport.authenticate('local', {session:true})(req, res, function() {

              console.log(req.user);
              console.log(req.session);
              res.redirect('/profile');
              console.log("Done!");
          });
        }
      });

    } else if (response.data.success === false) {
      console.log("Captcha failed.");
    }
  }).catch(error => {
    console.log(error);
  });

});

module.exports = router;


Profile.js(路由器)

const express = require('express');
const router = express.Router();

router.get('/', function(req, res) {
  if (req.isAuthenticated()) {
    res.render('profile')
  } else {
    res.redirect('/register')
    console.log('Not a user.')
  }
})


module.exports = router;

App.js

var registrationRouter = require('./routes/register');
var profileRouter = require('./routes/profile');

app.use('/register', registrationRouter);
app.use('/profile', profileRouter);

module.exports = app;

所以经过几个小时的尝试,我想通了。我的问题是我在 Register.js

中使用了以下代码
app.use(session({
  secret:"Edit Later.",
  resave:true,
  saveUninitialized:true
}));

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

这是一个问题,因为 Register.js 被用作路由器,我通过 [=31= 将所有请求定向到此路由]。这导致应用程序在 Register.js 处理请求之前未正确配置。以上几行是配置代码,必须写在App.js中的app.use('/register', registrationRouter);之前。因此,修复只是将这些行移动到 App.js 就像这样 -

\configure App

app.use(session({
  secret:"Edit Later.",
  resave:true,
  saveUninitialized:true
}));

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

\handle router

app.use('/register', registrationRouter);