паспорт 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.Я потерял много времени, надеюсь, этот ответ спасет тебя.
некоторые общие проблемы, чтобы следить за,
- порядок установки промежуточного по (экспресс-сессия > pass.инициализировать > передать.session) (и пока вы это делаете, проверьте свой синтаксис).
- сериализовать и десериализовать методы необходимо передать пользователю по запросу.(Для получения дополнительной информации я опубликовал ответ по этой ссылке.. основы паспортной сессии (expressjs) - почему нам нужно сериализовать и десериализовать?) если нет пользователя по запросу, isAuthenticated вернет false.... и перенаправить на определенный путь ......когда ложь....И... ОЧЕРЕДНОЙ РАЗ.....ПРОВЕРЬТЕ СИНТАКСИС.
- на 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
.