首页 > 解决方案 > 登录后POST路由不重定向

问题描述

我正在使用登录系统(Passport JS)创建应用程序。我在本地登录时遇到了一点问题。我已经提供了所有必要的代码,但问题是,当我尝试登录(passport-local)时,应用程序将我重定向到错误的路线。使用 Google OAuth 登录没有类似的问题。我的意思是说:

会话配置和护照初始化app.js

app.use(
  session({
    secret: 'session',
    resave: false,
    saveUninitialized: true,
    store: MongoStore.create({
        mongoUrl: process.env.MONGO_URI,
        // ttl: 10 * 120 // save session for
    }),
    cookie: {
        maxAge: 1000 * 60 * 60 * 24
    }
  })
)
require('./config/passport')(passport);
require('./config/passport_log')(passport);
// is it even legal to have 2 or more passport configs?
app.use(passport.initialize());
app.use(passport.session());

护照本地配置passport_log.js

function(passport) {
    const verifyCallback = (username, password, done) => {
            LogUser.findOne({username: username}, 'username salt hash')
                .then((user) => {
                console.log(user)
                    if (!user) {console.log('invalid'); return done(null, false)}
                    const isValid = validPassword(password, user.hash, user.salt);
                    if (isValid) {
                        console.log('valid')
                        return done(null, user);
                    } else {
                        return done(null, false);
                    };
                })
                .catch((err) => {
                    done(err);
                });
        };
    passport.use(new LocalStrategy(verifyCallback));
    passport.serializeUser((user, done) => {
        console.log(user)
        done(null, user.id);
    });
    passport.deserializeUser((userId, done) => {
        LogUser.findById(userId)
            .then((user) => {
                console.log('deser')
                done(null, user);
            })
            .catch(err => done(err))
    });
}

代码执行后返回“有效”。

/loginPOST 和 GET 路由以及/privateGET 路由index.js

router.post('/login', 
    passport.authenticate('local', {
        failureRedirect: '/login',
        successRedirect: '/private'
    })
);
router.get('/login', isNotLogin, (req, res) => {
    res.render('view/login');
});
router.get('/private', isLogin, (req, res) => {
    res.render('view/private');
});

和身份验证配置来自auth.js

module.exports = {
    isLogin: function (req, res, next) {
        if (req.isAuthenticated()) {
            console.log('ok')
            return next();
        } else {
            console.log('not')
            res.redirect('/login');
        }
    },
    isNotLogin: function (req, res, next) {
        if (!req.isAuthenticated()) {
            console.log('isnotok')
            return next (); 
        } else {
            console.log('isnotnot')
            res.redirect('/private');
        }
    }
};

它返回notisnotok在控制台中。

尝试登录后,控制台返回:

valid
POST /login 302 156.267 ms - 60
not
GET /private 302 83.408 ms - 56
isnotok
GET /login 200 87.810 ms - 3394

所以它把我重定向到/private,然后又回到/login

老实说,我不知道错误可能出在哪里。

所有代码:https ://github.com/kbilak/ToDoApp

标签: javascriptnode.jsauthenticationpassport-local

解决方案


推荐阅读