Passport Authenticate 不重定向
Passport Authenticate doesn't redirect
我正在编写一个本地注册策略并注意到它不起作用,所以我退后一步并尝试对我的空集合进行身份验证。每次我提交表单都需要大约 30-40 秒,直到导致超时。我确保 passport.authenticate() 被调用,但它似乎没有进行任何重定向,因此超时,因为我也没有渲染任何东西。
问题:
- 我预计它会重定向到 failureUrl(即“/signup”),但实际上什么也没有发生。我在这里做错了什么?
- 为什么没有来自 passport 的单个日志消息?这让我发疯,因为我完全不知道那里出了什么问题。
- 我是 node.js 的新手,据我所知,我不需要将配置的护照对象传递给路由器,但我可以这样做
const passport = require('passport')
对吗?
这是我的 /signup 路由函数处理程序:
function processSignup (req, res) {
logger.info("POST request received")
logger.info(req.body)
passport.authenticate('local', {
successRedirect : '/profile', // redirect to the secure profile section
failureRedirect : '/signup', // redirect back to the signup page if there is an error
failureFlash : true // allow flash messages
})
}
温斯顿打印:
7:32:04 PM - info: POST request received 7:32:04 PM - info:
username=dassd@dass.de, password=dasdsa, submit=Register
我的 passport.js 文件如下所示:
const LocalStrategy = require('passport-local').Strategy
const User = require('./user-model')
const passport = require('passport')
// expose this function to our app using module.exports
function config() {
passport.serializeUser(function(user, done) {
done(null, user.id)
})
// used to deserialize the user
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user)
})
})
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
}
module.exports = {
config: config
}
我的相关截图app.js:
// required for passport
require('./authentication/passport').config();
app.use(cookieParser())
app.use(bodyParser())
app.use(session({
secret: 'secretToBeChanged',
saveUninitialized: false,
resave: false
}))
app.use(passport.initialize())
app.use(passport.session()) // persistent login sessions
app.use(flash()) // use connect-flash for flash messages stored in session
快速查看 passportjs 的文档后,我认为您需要执行以下操作:
function processSignup (req, res, next) {
logger.info("POST request received")
logger.info(req.body)
const handler = passport.authenticate('local', {
successRedirect : '/profile', // redirect to the secure profile section
failureRedirect : '/signup', // redirect back to the signup page if there is an error
failureFlash : true // allow flash messages
});
handler(req, res, next);
}
passport.authenticate()
returns 一个用作路由处理函数的函数。
通常,您会键入如下内容:
app.post('/login', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
}));
但是由于您已经使用自己的路由处理函数进行了抽象,因此您需要调用从 passport.authenticate()
返回的函数。
最终 Mikael Lennholm 是对的,他为我指出了正确的方向。我在任何 passport.js 教程中都找不到它。但是 passport.js 文档包含此代码片段,它表示相同但我更喜欢它的代码样式:
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
})(req, res, next);
我正在编写一个本地注册策略并注意到它不起作用,所以我退后一步并尝试对我的空集合进行身份验证。每次我提交表单都需要大约 30-40 秒,直到导致超时。我确保 passport.authenticate() 被调用,但它似乎没有进行任何重定向,因此超时,因为我也没有渲染任何东西。
问题:
- 我预计它会重定向到 failureUrl(即“/signup”),但实际上什么也没有发生。我在这里做错了什么?
- 为什么没有来自 passport 的单个日志消息?这让我发疯,因为我完全不知道那里出了什么问题。
- 我是 node.js 的新手,据我所知,我不需要将配置的护照对象传递给路由器,但我可以这样做
const passport = require('passport')
对吗?
这是我的 /signup 路由函数处理程序:
function processSignup (req, res) {
logger.info("POST request received")
logger.info(req.body)
passport.authenticate('local', {
successRedirect : '/profile', // redirect to the secure profile section
failureRedirect : '/signup', // redirect back to the signup page if there is an error
failureFlash : true // allow flash messages
})
}
温斯顿打印:
7:32:04 PM - info: POST request received 7:32:04 PM - info: username=dassd@dass.de, password=dasdsa, submit=Register
我的 passport.js 文件如下所示:
const LocalStrategy = require('passport-local').Strategy
const User = require('./user-model')
const passport = require('passport')
// expose this function to our app using module.exports
function config() {
passport.serializeUser(function(user, done) {
done(null, user.id)
})
// used to deserialize the user
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user)
})
})
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
}
module.exports = {
config: config
}
我的相关截图app.js:
// required for passport
require('./authentication/passport').config();
app.use(cookieParser())
app.use(bodyParser())
app.use(session({
secret: 'secretToBeChanged',
saveUninitialized: false,
resave: false
}))
app.use(passport.initialize())
app.use(passport.session()) // persistent login sessions
app.use(flash()) // use connect-flash for flash messages stored in session
快速查看 passportjs 的文档后,我认为您需要执行以下操作:
function processSignup (req, res, next) {
logger.info("POST request received")
logger.info(req.body)
const handler = passport.authenticate('local', {
successRedirect : '/profile', // redirect to the secure profile section
failureRedirect : '/signup', // redirect back to the signup page if there is an error
failureFlash : true // allow flash messages
});
handler(req, res, next);
}
passport.authenticate()
returns 一个用作路由处理函数的函数。
通常,您会键入如下内容:
app.post('/login', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
}));
但是由于您已经使用自己的路由处理函数进行了抽象,因此您需要调用从 passport.authenticate()
返回的函数。
最终 Mikael Lennholm 是对的,他为我指出了正确的方向。我在任何 passport.js 教程中都找不到它。但是 passport.js 文档包含此代码片段,它表示相同但我更喜欢它的代码样式:
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
})(req, res, next);