node.js - management - la req.is autenticada del pasaporte siempre devuelve falso, incluso cuando tengo el código duro hecho(nulo, verdadero)
passport npm (9)
Esto también podría ser un problema con las llamadas POST / GET de su cliente. Tuve exactamente el mismo problema, pero resultó que tuve que darle fetch
(que es lo que estaba usando), las credentials:''include''
la opción credentials:''include''
así:
fetch(''/...'', {
method: ''POST'',
headers: myHeaders,
credentials: ''include'',
body: ...
...})
El motivo es porque fetch no admite la transmisión de cookies, que es necesario en este caso.
Estoy intentando que mi estrategia local de Passport funcione.
Tengo este middleware configurado:
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"});
}));
pero luego aquí
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(''/'');
}
siempre falla y redirige a la página de inicio.
No puedo entender por qué está pasando esto? ¿Por qué no se autenticará?
En mi consola puedo ver que la Password Correct
está imprimiendo. ¿Por qué no funciona?
Mi problema fue que configuré cookie.secure en true incluso si los datos no superaban 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
}));
Recuerde establecer las cookies en falso si no está utilizando https
cookie: { secure: false } // Set to false
Además, si crees que tienes https, recuerda confiar en el proxy
app.set(''trust proxy'', 1) // trust first proxy
PARA NUEVOS
Estaba enfrentando un problema similar, donde mi función isAuthenticated () devolvería false. Perdí mucho tiempo, espero que esta respuesta salve la tuya.
Algunos problemas comunes a tener en cuenta,
- Orden de instalación de middleware (sesión-express> pass.initialize> pass.session) (y mientras lo hace, COMPRUEBE SU SINTAXIS).
- Los métodos Serializar y Deserializar deben pasar al usuario en la solicitud. (Para obtener más información, he publicado una respuesta en este enlace. Conceptos básicos de la sesión de pasaportes (expressjs) - ¿Por qué necesitamos serializar y deserializar? ) Si no hay usuarios en request then isAuthenticated devolverá false .... y lo redireccionará a la RUTA definida ...... cuando sea falso .... Y ... UNA VEZ MÁS ..... COMPRUEBA TU SINTAXIS.
- La función getUserById o findById definida en el modelo (user.js) necesita tener definida una función User.findById (y no User.findOne Again CHECK YOUR .. WAIT FOR IT..SYNTAX) (esta función cargaría al usuario en el solicitud en cada sesión)
Si envuelve sus rutas de esta manera:
module.exports = function(){
router.get(''/'',(req,res)=>{
res.send(''stuff'');
}
}
Tienes que pasar "aplicación y pasaporte" a tus rutas de la siguiente manera:
module.exports = function(app,passport){
//routes n stuff
}
Solucioné este problema al arreglar mi pasaporte.deserializeUser . Estoy usando mongo nativo y como la mayoría de los ejemplos usan Mangosta, caí en la trampa _id una vez más.
Así que recuerde hacer que _id sea un ObjectID mongo cuando lea el usuario en 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);
});
});
Mi consulta no buscaba al usuario, ya que no convertí el ID en un ObjectID y no aparecía ningún error en ninguna parte.
También estaba enfrentando el mismo problema, pero @PVThomas me da solución, como aquí en Respuestas. Mi problema fue con el método findById()
en deserialize()
. Estaba usando findOne()
en findById()
y luego lo reemplacé con find()
y ahora req.isAuthenticated()
funciona bien. Mi aplicación no estaba guardando req.session.passport.user
, estaba devolviendo undefined y después de la sustitución de findOne()
con find()
está guardando el ID de usuario en req.session.passport.user
.
Tuve el mismo problema al olvidar añadir
request.login()
en
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);
}
);
Espero que eso pueda ayudar a otros que terminaron aquí por la misma razón que yo.
Tuve un problema similar. Podría deberse al middleware de sesión expresa necesario para el pasaporte. Se corrigió mediante el uso de middlewares en el siguiente orden: (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());
Use la Autenticación de la manera que se indica a continuación, ya que funcionará con certeza, ya que el pasaporte quiere una sesión expresa para la persona que está autenticada para trabajar
//======================================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();
});