登录后POST路由不重定向

时间:2021-06-21 19:24:18

标签: javascript node.js authentication passport-local

我正在使用登录系统(Passport JS)创建应用程序。我在本地登录时遇到了一些问题。我已经提供了所有必要的代码,但问题是,当我尝试登录(本地护照)时,应用程序将我重定向到错误的路线。使用 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 中的 Passport 本地配置:

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))
    });
}

代码执行后返回'valid'。

/login POST 和 GET 路由以及 /private 中的 index.js GET 路由:

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

0 个答案:

没有答案