簡體   English   中英

Passport.js 沒有將用戶傳遞給 req.login() 中的請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM