[英]Passport.js is not passing user to request in req.login()
我的passport.js 配置是這樣的:
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);
});
}));
我正在更改每個函數中的貓鼬模型,因為我一次處理多個集合,並且我喜歡完全控制正在發生的事情。
我的 router.js 文件具有以下使用通行證中間件的路徑:
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);
});
其中,在成功驗證后,重定向到 /admin/filter 在同一個路由器中,就像這樣。
app.get("/admin/filter", isLoggedIn, function(req, res){
//rendering stuff here
});
現在,管理員/過濾器請求通過了一個叫做isLoggedIn
的中間件,理論上它可以保護我的端點。 它是這樣的:
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();
}
現在,您會期望因為我調用了 req.login 並且我被重定向到我選擇的端點,所以請求將被驗證。 不是這種情況。
Request Login supossedly successful.
This is the authentication middleware, is req authenticated?
false
Does req.user exist?
undefined
我似乎無法找到問題的根源。 當策略被調用時,一切都會檢查出來,還有回調函數和req.login
,理論上會渲染一個包含數據的req.user
對象。 我觀察到的一件奇怪的事情是我沒有看到passport.deserializeUser()
方法在起作用。 曾經。 但這可能與問題無關。 Passport 肯定在使用我的策略並呈現用戶對象,但不知何故這個相同的對象並沒有進入請求。 你對正在發生的事情有什么建議或想法嗎?
我通過在我第一次學習如何使用 Passport 中間件時開始使用的教程來解決這個問題。 原來我的配置是錯誤的:我的代碼在服務器文件中曾經是這樣的:
pass = require("passport");
app.use(pass.initialize());
app.use(pass.session());
require("./app/config/passport.js")(pass);
當它應該是這樣的:
pass = require("passport");
require("./app/config/passport.js")(pass);
app.use(pass.initialize());
app.use(pass.session());
要么我錯過了文檔中指定配置必須在初始化之前出現的部分,要么只是將其作為一件小事來評論。 不管怎樣,我解決了我的問題。
在發送 post 請求時確保withCredentials: true
。
// register
axios.post(uri, {
email: email,
password: password,
confirmPassword: confirmPassword
}, {
withCredentials: true
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.