【问题标题】:No redirect on failed passport authentication护照认证失败时不重定向
【发布时间】:2017-09-27 17:47:24
【问题描述】:

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]);
        });
    })
);

【问题讨论】:

  • 成功发送socket请求后你想要什么?
  • 路由端基本上没有任何事情发生。那时我已经做了我想做的事。
  • 只要使用res.end();
  • 试过了,还是发到/login,实际上并不存在
  • See res.end() 只会终止您当前的请求,并且不会进入浏览器,因此它会显示来自客户端的请求的页面,但服务器响应没有任何价值,让我知道您想要哪个页面然后显示?

标签: node.js passport.js


【解决方案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);
    });

.ejs 页面中的 ajax 调用

$.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");
            });
    });

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

【讨论】:

    猜你喜欢
    • 2013-05-27
    • 1970-01-01
    • 2023-03-26
    • 2023-03-14
    • 1970-01-01
    • 2019-01-19
    • 2019-03-08
    • 1970-01-01
    • 2013-06-09
    相关资源
    最近更新 更多