Moja konfiguracja passport.js idzie tak:Passport.js nie przechodzi użytkownikowi wystąpić w req.login()
const Local = require("passport-local").Strategy;
const USMODEL = require("../models/user.js");
passport.serializeUser(function(user, done) {
console.log("SERIALIZING USER");
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
console.log("DESUSER", id);
var US = mongoose.model("RegUser", USMODEL);
US.findById(id, function(err, user) {
done(err, id);
});
});
passport.use("local-login", new Local({
usernameField: "email",
passwordField: "password",
passReqToCallback: true
},function(req, email, password, done) {
var US = mongoose.model("RegUser", USMODEL);
US.findOne({"email": email}, function(err, user){
if(err) throw err;
if(!user) return done(null, false);
if(!user.validPassword(password)) {
console.log("password not valid");
return done(null, false);
}
return done(null, user);
});
}));
mam zmiany modelu Mongoose w każdej z funkcji, bo pogodzić z wieloma zbiorami na raz i lubię mieć pełną kontrolę nad tym, co się dzieje.
Mój plik router.js ma następujące ścieżki, które wykorzystują middleware paszportu:
app.get("/user/login", function(req, res) {
res.render("signin");
});
app.post('/user/login', function (req, res){
passport.authenticate('local-login', function(err, user, info){
if (err) return res.redirect("/");
if (!user) return res.redirect('/');
else {
req.login(user, function(err) {
if (err) return next(err);
console.log("Request Login supossedly successful.");
return res.redirect('/admin/filter');
});
}
})(req, res);
});
, który po pomyślnym uwierzytelnieniu przekierowuje do/admin/filtr w tym samym routerze, że idzie tak tak.
app.get("/admin/filter", isLoggedIn, function(req, res){
//rendering stuff here
});
Teraz wniosek admin/filtr mija middleware nazwie isLoggedIn
który teoretycznie chroni moje punkty końcowe. To idzie tak:
function isLoggedIn(req, res, next) {
console.log("This is the authentication middleware, is req authenticated?");
console.log(req.isAuthenticated());
console.log("Does req.user exist?")
console.log(req.user);
return next();
}
Teraz można się spodziewać, że z powodu zadzwoniłem req.login i mam przekierowany do mojego końcowego wyboru, wniosek zostanie uwierzytelniony. Nie o to chodzi.
Request Login supossedly successful.
This is the authentication middleware, is req authenticated?
false
Does req.user exist?
undefined
Nie mogę znaleźć źródła mojego problemu. Wszystko sprawdza się, gdy wywoływana jest strategia, a także funkcja wywołania zwrotnego i req.login
, która w teorii renderowałaby obiekt o wartości req.user
. Jedną z dziwnych rzeczy, które zaobserwowałem, jest to, że nie widzę w działaniu metody passport.deserializeUser()
. Zawsze. Ale to może być styczne z problemem. Paszport zdecydowanie używa mojej strategii i renderuje obiekt użytkownika, ale jakoś ten sam obiekt nie wchodzi w zakres żądania. Czy masz jakieś sugestie lub pomysł na temat tego, co się dzieje?
Czy potrzebujesz również "wymagać (" paszportu ")? lub jest "paszportowo-lokalny", zajmując się tym - zainstalowałem paszport od zera i miałem podobne problemy w jednym punkcie - próbując sobie przypomnieć, na czym polegał problem. – ewizard
spróbuj wstawić 'req.login (użytkownik ...' w pliku passport.js w funkcji zwrotnej na końcu – ewizard
tak @ewizard paszport-local wymaga użycia paszportu, ponieważ obejmuje on tylko strategię –