Node.js和PassportJs:如果身份验证失败,则不会在passport.authenticate之后重定向中间件

宝莉

我没有登录页面,但是每个页面上都有一个登录表单。我想将用户重定向到他们所在的同一页面,而不管身份验证是否成功(使用适当的Flash消息)

采取以下代码:

app.post('/login', validateLogin, passport.authenticate('local-login'), function(req, res) {

    var redirectUrl = '/'; 

    if(req.body.to.length > 0){
        redirectUrl = req.body.to;  
    }

    console.log("THIS IS ONLY CALLED IF passport.authenticate() IS SUCCESSFUL");
    res.redirect(redirectUrl);
});

如果通过身份验证,我只会看到上面的最终中间件被调用。如果失败,则护照似乎以get请求的形式将我重定向到/ login。在我的应用中,该页面不存在。

如果我在护照身份验证功能中将其他选项对象作为参数传递,那么它将起作用:

app.post('/login', validateLogin, passport.authenticate('local-login', {

successRedirect : '/', // redirect to the secure profile section
    failureRedirect : '/signup', // redirect back to the signup page. THIS IS JUST FOR TESTING TO SEE IF THE REDIRECT ON FAIL WORKS.
    failureFlash : true, // allow flash messages

}


));

但是这样做会失去选择用户重定向到的位置的能力。如果身份验证失败,护照似乎可以控制用户重定向到的位置。我怎样才能解决这个问题?还是一个错误?如果身份验证失败,是否必须将护照身份验证作为链中的最后一个中间件?

这是我的本地策略函数调用:

//LOCAL LOGIN

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


    console.log("IN PASSPORT");

   if(email.length == 0 || password.length == 0){

       console.log("FIELDS ARE EMPTY"); 
      return done(null, false, req.flash('loginMessage', 'Fill in all values.'));

   }

    // 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);
        console.log("db err");
        }
        // if no user is found, return the message
        if (!user){
            console.log("not user");
            return done(null, false, req.flash('loginMessage', 'Incorrect details.')); // 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)){
            console.log("invalid pw");
            return done(null, false, req.flash('loginMessage', 'Incorrect details.')); // create the loginMessage and save it to session as flashdata
        }    
        // all is well, return successful user
        console.log("All OK");
        return done(null, user);
    });

}));
ploutch

您可以使用http://passportjs.org/guide/authenticate/上一节中所述的自定义身份验证回调

app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    // Redirect if it fails
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      // Redirect if it succeeds
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Node.js / Express中连接中间件

来自分类Dev

Node JS较少中间件无法自动编译

来自分类Dev

使用Stylus和CoffeeScript中间件是否会降低Node.js Express应用的速度?

来自分类Dev

Node.js-导致404的外部中间件

来自分类Dev

通过带有重定向和中间件的Express服务出“静态”路由

来自分类Dev

Laravel 5.1中中间件之前和之后的区别

来自分类Dev

在Node.js中的res.end()之后重定向

来自分类Dev

Laravel 5身份验证中间件始终重定向到root或登录

来自分类Dev

Django需要登录名中间件不会重定向

来自分类Dev

Node.js中间件包装

来自分类Dev

基于角色的Nuxt.js中间件重定向

来自分类Dev

使用Node.js的Passport.js身份验证中间件

来自分类Dev

身份验证后重定向到Passport.js中的上一页(不重复)Node.js

来自分类Dev

如何编写中间件以修改Node JS中的响应

来自分类Dev

用于Node.js的Passport中间件

来自分类Dev

Slim isLoggedIn小型中间件,如果已经登录则可以重定向用户

来自分类Dev

如果用户无效,则中间件将用户重定向到路径

来自分类Dev

使用Node.js和Passport进行身份验证后,如何将用户重定向至带有其ID的主页?

来自分类Dev

基本的node.js中间件

来自分类Dev

Node js:猫鼬中间件中的Bluebird Promisify

来自分类Dev

Laravel 5.1中中间件之前和之后的区别

来自分类Dev

在node.js中的res.end()之后重定向

来自分类Dev

节点js使用中间件重定向的重定向过多

来自分类Dev

使用Node的Passport JS的Facebook身份验证失败

来自分类Dev

Node Express:未执行 Passport JWT 中间件

来自分类Dev

Laravel - Auth::check() 返回 false,但中间件身份验证未重定向

来自分类Dev

如何在中间件中使用 firebase 作为 node.js 的登录身份验证?

来自分类Dev

如果用户在 URL Laravel 中键入 POST 路由,则用于重定向用户的中间件

来自分类Dev

Laravel - 如何防止登录和中间件后重定向?

Related 相关文章

  1. 1

    在Node.js / Express中连接中间件

  2. 2

    Node JS较少中间件无法自动编译

  3. 3

    使用Stylus和CoffeeScript中间件是否会降低Node.js Express应用的速度?

  4. 4

    Node.js-导致404的外部中间件

  5. 5

    通过带有重定向和中间件的Express服务出“静态”路由

  6. 6

    Laravel 5.1中中间件之前和之后的区别

  7. 7

    在Node.js中的res.end()之后重定向

  8. 8

    Laravel 5身份验证中间件始终重定向到root或登录

  9. 9

    Django需要登录名中间件不会重定向

  10. 10

    Node.js中间件包装

  11. 11

    基于角色的Nuxt.js中间件重定向

  12. 12

    使用Node.js的Passport.js身份验证中间件

  13. 13

    身份验证后重定向到Passport.js中的上一页(不重复)Node.js

  14. 14

    如何编写中间件以修改Node JS中的响应

  15. 15

    用于Node.js的Passport中间件

  16. 16

    Slim isLoggedIn小型中间件,如果已经登录则可以重定向用户

  17. 17

    如果用户无效,则中间件将用户重定向到路径

  18. 18

    使用Node.js和Passport进行身份验证后,如何将用户重定向至带有其ID的主页?

  19. 19

    基本的node.js中间件

  20. 20

    Node js:猫鼬中间件中的Bluebird Promisify

  21. 21

    Laravel 5.1中中间件之前和之后的区别

  22. 22

    在node.js中的res.end()之后重定向

  23. 23

    节点js使用中间件重定向的重定向过多

  24. 24

    使用Node的Passport JS的Facebook身份验证失败

  25. 25

    Node Express:未执行 Passport JWT 中间件

  26. 26

    Laravel - Auth::check() 返回 false,但中间件身份验证未重定向

  27. 27

    如何在中间件中使用 firebase 作为 node.js 的登录身份验证?

  28. 28

    如果用户在 URL Laravel 中键入 POST 路由,则用于重定向用户的中间件

  29. 29

    Laravel - 如何防止登录和中间件后重定向?

热门标签

归档