паспорт req.isAuthenticated всегда возвращает false, даже когда я hardcode сделал(null, true)

Я пытаюсь получить мой паспорт местной рабочей стратегии.

Я настроил это промежуточное ПО:

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"});
}));

но тогда здесь

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('/');
}

Он всегда терпит неудачу и перенаправляет на домашнюю страницу.

Я не могу понять, почему это происходит? Почему он не аутентифицируется?

В моей консоли я вижу, что это Password Correct печати. Почему это не работает?

9 ответов


У меня была аналогичная проблема. Может быть, из-за промежуточного программного обеспечения экспресс-сессии, необходимого для паспорта. Исправлено с помощью промежуточных программ в следующем порядке: (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());

Это также может быть проблемой с сообщением / получением звонков вашего клиента. У меня была такая же проблема, но оказалось, что я должен был дать fetch (что я и использовал) опция credentials:'include' вот так:

fetch('/...', {
  method: 'POST',
  headers: myHeaders,
  credentials: 'include',
  body: ...
  ...})

причина в том, что fetch не поддерживает передачу файлов cookie, что необходимо в этом случае.


ДЛЯ НОВИЧКОВ

Я столкнулся с аналогичной проблемой, когда моя функция isAuthenticated () вернет false.Я потерял много времени, надеюсь, этот ответ спасет тебя.

некоторые общие проблемы, чтобы следить за,

  1. порядок установки промежуточного по (экспресс-сессия > pass.инициализировать > передать.session) (и пока вы это делаете, проверьте свой синтаксис).
  2. сериализовать и десериализовать методы необходимо передать пользователю по запросу.(Для получения дополнительной информации я опубликовал ответ по этой ссылке.. основы паспортной сессии (expressjs) - почему нам нужно сериализовать и десериализовать?) если нет пользователя по запросу, isAuthenticated вернет false.... и перенаправить на определенный путь ......когда ложь....И... ОЧЕРЕДНОЙ РАЗ.....ПРОВЕРЬТЕ СИНТАКСИС.
  3. на getUserById или findbyid осуществляет функция, определенная в модели (пользователь.js) должен иметь пользователя.findById (а не Пользователь.findOne снова проверьте.. ЖДАТЬ ОН..Синтаксис) определена функция.(эта функция будет загружать пользователя по запросу в каждом сеансе)

у меня была такая же проблема, забыв добавить

request.login()

on

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);
    }
);

надеюсь, это может помочь другим, которые оказались здесь по той же причине, что и я.


моя проблема заключалась в том, что я установил cookie.безопасный для true, даже если данные не были через https.

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
}));

не забудьте установить cookies в false, если вы не используете https

cookie: { secure: false } // Set to false

также, если вы считаете, что у вас есть https, не забудьте доверять прокси

app.set('trust proxy', 1) // trust first proxy

я исправил эту проблему, исправив мой паспорт.deserializeUser. Я использую Mongo native, и поскольку большинство примеров используют Мангуста, я снова попал в ловушку.

поэтому не забудьте сделать _id объектом mongo при чтении пользователя в deserializeUser

passport.deserializeUser(function(user, done) {
    const collection = db.get().collection('users')
    const userId = new mongo.ObjectID(user);
    collection.findOne({_id : userId}, function(err, user) {
        if (err) done(err, null);
        done(null, user);
    });
});

мой запрос не находил пользователя, так как я не сделал идентификатор ObjectID, и нигде не было никаких ошибок.


Если вы оберните свои маршруты так:

module.exports = function(){

router.get('/',(req,res)=>{
 res.send('stuff');
  }

}

вы должны пройти "приложение и паспорт" на ваши маршруты, как так:

module.exports = function(app,passport){

//routes n stuff

}

используйте аутентификацию следующим образом, он будет работать наверняка, так как паспорт хочет экспресс-сессию для isAuthenticated работать

//======================================installation of utilities======================================//
var express =      require("express"),
app =              express(),
bodyParser =       require("body-parser"),
mongoose =         require("mongoose"),
Campsite =         require("./models/campsite"),
override =         require("method-override"),
Comments =         require("./models/comments"),
seedDB =           require("./seed"),
User   =           require("./models/user.js"),
passport =         require("passport"),
passportlocal =    require("passport-local"),
passportmongoose = require("passport-local-mongoose")

//======================================uitilities setup ==============================================//

app.use(override("_method"))
app.use(bodyParser.urlencoded({ extended: true }))
app.set("view engine","ejs")
seedDB()

app.use(require("express-session")({
    secret:"random text input",
    resave:false,
    saveUninitialized:false
}))
app.use(passport.initialize())
app.use(passport.session())
passport.use(new passportlocal(User.authenticate()))
passport.serializeUser(User.serializeUser())
passport.deserializeUser(User.deserializeUser())
mongoose.connect("mongodb://localhost/yelpCamp")
app.use(function(req, res, next){
   res.locals.currentUser = req.user;
   next();
});

я также столкнулся с той же проблемой, но @PVThomas дает мне решение, как здесь в ответах. Моя проблема была с findById() метод deserialize(). Я использовал findOne() на findById() и затем Я заменил его на find() и теперь req.isAuthenticated() работает нормально. Мое приложение не сохраняло req.session.passport.user, он возвращался undefined а затем после замены findOne() С find() это сохранение идентификатора пользователя в req.session.passport.user.