我正在使用登录系统(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');
}
}
};
它在控制台中返回 not
和 isnotok
。
尝试登录后,控制台返回:
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
。
老实说,我不知道错误可能在哪里。