没有重定向失败的护照身份验证

时间:2017-04-29 20:05:03

标签: node.js passport.js

nodejs新手,喜欢它到目前为止,尝试为护照身份验证做一些自定义处理。成功重定向工作正常,但是在尝试失败后我不想继续发布事件 我试图完成的是触发警报,如果登录尝试出现问题,则会打开一个对话框(这部分按照我想要的方式,通过套接字调用)到当前页面。 如果我不调用res.send(),浏览器就会等待,或者尝试重定向到我不存在的页面。

routes.js

app.post('/login', function (req, res, next) {
    passport.authenticate('local-login', function (err, user, msg) {
        if (err) {
            io.emit('status alert', err);
        }
        if (!user) {
            io.emit('status alert', msg);
            //res.send();
        }
        req.logIn(user, function (err) {
            if (err) {
                io.emit('status alert', err);
            }
            if (user) {
                return res.redirect('/loginsplash');
            }
        });
    })(req, res, next);
});

passport.js

passport.use(
    'local-login',
    new LocalStrategy({
        usernameField : 'username',
        passwordField : 'password',
        passReqToCallback : true
    },
    function (req, username, password, done) {
        db.getConnection().query("SELECT * FROM users WHERE uname = ?", [username], function (err, rows) {
            if (err)
                return done(err);
            if (!rows.length) {
                return done(null, false,  'Invalid Username or Password.');
            }

            // if the user is found but the password is wrong
            if (!bcrypt.compareSync(password, rows[0].upw))
                return done(null, false, 'Invalid Username or Password.');

            // all is well, return successful user
            return done(null, rows[0]);
        });
    })
);

1 个答案:

答案 0 :(得分:1)

经过一个持续性和试验/错误的周末之后,我使用ajax的预感似乎是正确的。我终于遇到了类似的here,这很有帮助。希望这有助于其他人,我可能会调整一些,但现在基本上如果ajax响应为空(res.end),我的自定义对话框会弹出。如果其中包含某些内容(来自res.redirect),则会重定向到目标网页:

passport.js,上面没有变化

routes.js

app.post('/login/ajax', function (req, res, next) {
        passport.authenticate('local-login', function (err, user, info) {
                    if (err) { return next(err); }
                    if (!user) { return res.end(); }
                    req.logIn(user, function (err) {
                        if (err) { return next(err); }
                        return res.redirect('/loggedin');
                    });
        })(req, res, next);
    });

ajax在.ejs页面中调用

$.ajax({
        type: "POST",
        url: "/login/ajax",
        data: { username: username , password: password },
        dataType: 'html',
        success: function(data) {
        if (data) {
          window.location.href = '/loginsplash';
          }
          else {
            OpenFeedbackMsgDlg("Login Failed");
          }
        }
      }).done(function () {
                console.log("http request succeeded");
                alert("login success");
            });
    });

如果有人有建议/替代方法,我仍然有兴趣学习。