护照的req.isAuthenticated总是返回false,即使我硬编码完成(null,true)

Cod*_*ein 36 node.js express passport-local passport.js

我正试图让我的Passport本地策略正常运行.

我已经设置了这个中间件:

passport.use(new LocalStrategy(function(username, password, done) {
    //return done(null, user);
    if (username=='ben' && password=='benny'){
        console.log("Password correct");
        return done(null, true);
    }
    else
        return done(null, false, {message: "Incorrect Login"});
}));
Run Code Online (Sandbox Code Playgroud)

但是在这里

app.use('/admin', adminIsLoggedIn, admin);

function adminIsLoggedIn(req, res, next) {

    // if user is authenticated in the session, carry on 
    if (req.isAuthenticated())
        return next();

    // if they aren't redirect them to the home page
    res.redirect('/');
}
Run Code Online (Sandbox Code Playgroud)

它总是失败并重定向到主页.

我无法弄清楚为什么会这样?为什么不进行身份验证?

在我的控制台中,我可以看到Password Correct正在打印.为什么它不起作用?

小智 44

我有类似的问题.可能是由于护照所需的快速会话中间件.通过按以下顺序使用中间件修复它:( Express 4)

var session = require('express-session');

// required for passport session
app.use(session({
  secret: 'secrettexthere',
  saveUninitialized: true,
  resave: true,
  // using store session on MongoDB using express-session + connect
  store: new MongoStore({
    url: config.urlMongo,
    collection: 'sessions'
  })
}));

// Init passport authentication 
app.use(passport.initialize());
// persistent login sessions 
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)

  • 我的问题是我在调用'passport.use,serializeUser,deserializeUser',但我没有调用'app.use(passport.initialize());' 和'app.use(passport.session());' 在那之前 (9认同)
  • 我已经做了你上面所说的......但仍然面临着这个问题 (3认同)

PRA*_*ESE 10

对于新手

我遇到了类似的问题,我的isAuthenticated()函数会返回false.我失去了很多时间,希望这个答案可以保存你的.

一些常见问题需要注意,

  1. 中间件设置顺序(快速会话> pass.initialize> pass.session)(当你这样做时检查你的语法).
  2. 序列化和反序列化方法需要在请求中传递用户.(有关更多信息,我已在此链接上发布了答案.Passport会话基础(expressjs) - 为什么我们需要序列化和反序列化?)如果没有用户在请求然后isAuthenticated将返回false ....并重定向到定义的PATH ......当错误....并且......再次......检查你的语法.
  3. 模型中定义的getUserByIdfindById函数(user.js)需要有一个User.findById(而不是User.findOne再次检查你的......等待IT..SYNTAX)函数定义.(这个函数会加载用户的请求在每个会议中)

  • 我实际上需要使用 findOne 而不是 findById 因为我正在尝试对用户的电子邮件进行不区分大小写的查找。根据文档,findById 只是 findOne 的语法糖。我认为要求 findById 不应该成为可接受的解决方案的一部分。 (2认同)

Ale*_*x H 8

这也可能是您客户的POST/GET调用的问题.我有这个完全相同的问题,但事实证明我必须给fetch(这是我正在使用的)这样的选项credentials:'include':

fetch('/...', {
  method: 'POST',
  headers: myHeaders,
  credentials: 'include',
  body: ...
  ...})
Run Code Online (Sandbox Code Playgroud)

原因是因为fetch不支持传递cookie,这在这种情况下是必需的.


ozg*_*ral 6

我忘记添加也遇到了同样的问题

request.login()
Run Code Online (Sandbox Code Playgroud)

app.post('/login', 
    function(request, response, next) {
        console.log(request.session)
        passport.authenticate('login', 
        function(err, user, info) {
            if(!user){ response.send(info.message);}
            else{

                request.login(user, function(error) {
                    if (error) return next(error);
                    console.log("Request Login supossedly successful.");
                    return response.send('Login successful');
                });
                //response.send('Login successful');
            }

        })(request, response, next);
    }
);
Run Code Online (Sandbox Code Playgroud)

希望这可能会帮助那些和我一样最终在这里的人。

  • 注意:passport.authenticate() 中间件会自动调用 req.login()。该函数主要在用户注册时使用,在此期间可以调用 req.login() 自动登录新注册的用户。 (2认同)

Tho*_*uer 5

我的问题是即使数据未通过https设置,我也将cookie.secure设置为true。

app.use(require('express-session')({
    secret: process.env.sessionSecret,
    cookie: {
        maxAge: 1000 * 60 * 60 * 24 * 7 // 1 week
    },
    store: store,
    resave: false,
    saveUninitialized: false,
    cookie: { secure: false } // Remember to set this
}));
Run Code Online (Sandbox Code Playgroud)

如果您不使用https,请记住将cookie设置为false

cookie: { secure: false } // Set to false
Run Code Online (Sandbox Code Playgroud)

另外,如果您确实相信自己有https,请记住信任代理

app.set('trust proxy', 1) // trust first proxy
Run Code Online (Sandbox Code Playgroud)