Javascript Passport JS,错误重定向上的值为空
我在我的网站上使用标准的passport本地策略(带express.js)作为注册表单。当调用Javascript Passport JS,错误重定向上的值为空,javascript,node.js,express,passport.js,Javascript,Node.js,Express,Passport.js,我在我的网站上使用标准的passport本地策略(带express.js)作为注册表单。当调用failureRedirect时,它会正确地重定向回我的注册表单,但表单的所有值都被清除为空。我明白为什么会这样,因为重定向,但是。。。如果用户犯了一个简单的错误,比如忘记了复选框或者用户名已经被取了,那么这对用户来说是非常恼人的。(另外,我知道不应将密码发送回视图)。是否有办法即使在使用passport重定向后仍保留用户输入的值 //my route .post('', passport.authen
failureRedirect
时,它会正确地重定向回我的注册表单,但表单的所有值都被清除为空。我明白为什么会这样,因为重定向,但是。。。如果用户犯了一个简单的错误,比如忘记了复选框或者用户名已经被取了,那么这对用户来说是非常恼人的。(另外,我知道不应将密码发送回视图)。是否有办法即使在使用passport重定向后仍保留用户输入的值
//my route
.post('', passport.authenticate('local-signup', {
failureRedirect: '/account/signup', // redirect back to the signup page if there is an error
failureFlash: true // allow flash messages
}), function(req, res) {
...
});
护照代码
passport.use('local-signup', new LocalStrategy({
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true // allows us to pass back the entire request to the callback
}, function(req, username, password, done) {
process.nextTick(function() {
if(password != params.password2) {
return done(null, false, req.flash('error', 'Passwords do not match.'));
}
User.findOne({
'username': username
}, function(err, user) {
// if there are any errors, return the error
if (err)
return done(err);
if (user) {
return done(null, false, req.flash('error', 'That username is already taken.'));
} else {
... create a new user ...
}
});
});
}));
function(req, username, password, done) {
如果您在路线逻辑中包装passport会怎么样。比如说,
app.post('/login', function(req, res, next) {
// Do something here with the username & password, like
// checking if the username is available.
if (!username || !password) {
// Render the login form, and pass in the username and password.
res.render('/login', {username: username, password: password});
} else {
// If all is validated, attempt the login:
passport.authenticate('local-signup', {
failureRedirect: '/account/signup',
failureFlash: true
}), function(req, res) {
...handle response here...
}
}
});
我不确定所有这些在语法上是否正确,但我们的想法是,在尝试使用Passport进行身份验证之前,您必须执行任何特定于应用程序的验证。我想这是可行的,但它似乎不像我所希望的那样完美/干净。在我看来,这似乎是一个失败的“中间件”,它通过了
req
obj,错误将完美地工作。然后,您可以将所有验证和验证逻辑放在一个地方。虽然我同意在一个地方处理验证和验证会很好,但我认为Passport的目的只是提供验证,并将验证留给您。关于护照,第一句是“护照的唯一目的是验证请求”。。。虽然存在失败的挂钩,但我认为验证不属于这个范围,但验证是构建在策略中的。如果您省略用户名和密码,则会出现“缺少凭据”错误。是的,存在一些验证(缺少用户名和密码),但如果您希望它执行您所说的操作(存储用户名和密码),它(1)需要与所有策略(本地、Facebook、谷歌等)兼容,(2)与“用户”兼容详细信息也完全不同(这会导致不同的回调签名)。上面,您使用的是本地策略——将其与谷歌和Facebook策略进行比较,后者处理响应的方式不同。