标签:javascript jquery ajax node-js passport-js
如果我使用表单字段action =“/ login”,method =“post”发送登录请求,它就可以了.类似于可用的代码here或here.
但如果相反,如果我使用jquery / ajax发送相同的信息,那么护照似乎不起作用.没有通过护照进行实际登录,但是ajax调用给出了误导性的成功消息.
以下不起作用.虽然我收到“登录成功”消息,但登录并没有真正发生.
$('#login_button').click(function () {
var email = $('#email').val();
var password = $('#password').val();
alert ('email/pass:' + email + ", " + password);
$.ajax({
type: "POST",
url: "/login",
data: { email: email , password: password },
dataType: 'html'
})
.done(function () {
console.log("http request succeeded");
alert("login success");
});
});
我需要使用ajax方法,以便在成功登录后我可以在客户端做一些有用的事情.例如.启动socket.io.
请帮忙.我的修改后的代码可以在这里找到:my-modified-code
解决方法:
我尝试了你的代码和Passport-wise它的工作原理.我做了“本地注册”,“注销”,然后“本地登录”,并成功通过身份验证,但在UI中没有任何表示.
这与您正在讨论的302相关 – 服务器回复302,因为您已经定义了successRedirect:’/ profile’,然后jQuery跟随重定向并接收到无法解析的HTML,因为它需要JSON.由于您没有在$.ajax调用中定义的.fail()回调,因此您看不到它.
会话很好,但可以通过手动到/ profile看到.
当您使用常规HTML表单登录时,浏览器将发送单个HTTP请求并根据响应进行操作(例如,呈现HTML页面,或者如果它是302则执行重定向).当你调用$.ajax时,同样的情况发生在不同的上下文中 – AJAX调用遵循重定向,因为它发出了请求,但浏览器没有.
您应该为AJAX和HTML登录使用单独的路由,或使用custom callback并根据req.accepts()
确定要返回的内容.
单独的路线可以是例如.
// AJAX logins to this URL, redirect on client side using
// window.location.href if login succeeds
app.post('/login/ajax', passport.authenticate('local-login'));
// HTTP login form send to this URL
app.post('/login', passport.authenticate('local-login', {
successRedirect : '/profile',
failureRedirect : '/login',
failureFlash : true
}));
自定义回调可能是这样的(未经测试):
app.post('/login', function(req, res, next) {
passport.authenticate('local-login', function(err, user, info) {
switch (req.accepts('html', 'json')) {
case 'html':
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/profile');
});
break;
case 'json':
if (err) { return next(err); }
if (!user) { return res.status(401).send({"ok": false}); }
req.logIn(user, function(err) {
if (err) { return res.status(401).send({"ok": false}); }
return res.send({"ok": true});
});
break;
default:
res.status(406).send();
}
})(req, res, next);
});
标签:javascript,jquery,ajax,node-js,passport-js 来源: https://codeday.me/bug/20190824/1713533.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。