我正在努力在我的节点应用程序中实现护照身份验证,我无法理解为什么在我可以访问响应(res)属性之前需要重定向? app.get('/api/loginFailure', function(req, res) { res.status(401).json({message: 'Logi
app.get('/api/loginFailure', function(req, res) { res.status(401).json({message: 'Login Failed', success: true}); }); app.get('/api/loginSuccess', function(req, res) { res.status(200).json({message:'Welcome!', success: true}); }); // process the login form app.post('/api/login', passport.authenticate('local-login', { successRedirect: '/api/loginSuccess', failureRedirect: '/api/loginFailure'}));
如您所见,我使用successRedirect访问不同的路由以发回json响应.我不希望节点api重定向实际的应用程序,因为它的目的是使它与前端无关.
本地登录策略如下.我怀疑我的困难可能在于我如何从该方法返回;
passport.use('local-login', new LocalStrategy({ // by default, local strategy uses username and password, we will override with email usernameField: 'email', passwordField: 'password', passReqToCallback: true // allows us to pass back the entire request to the callback }, function(req, email, password, done) { // callback with email and password from our form // find a user whose email is the same as the forms email // we are checking to see if the user trying to login already exists User.findOne({ 'local.email': email }, function(err, user) { // if there are any errors, return the error before anything else if (err) return done(err); // if no user is found, return the message if (!user) { return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash } // if the user is found but the password is wrong if (!user.validPassword(password)) { return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata } // all is well, return successful user return done(null, user); }); }));
我打算删除所有的flashdata以及什么不是,但是现在只能将2个额外的api路由折叠到/ api / login中会很棒.
I am unable to understand why there needs to be a redirect before I can access the response (res) attribute?
如果您检查了passport documentation,而不是从this guide复制代码(这是另一种类型的使用),您会发现它并不总是需要重定向.
您也可以通过以下方式使用它:
app.post('/login', passport.authenticate('local'), function(req, res) { // If this function gets called, authentication was successful. // `req.user` contains the authenticated user. res.redirect('/users/' + req.user.username); } );