我已经阅读了一些关于网络的文章甚至实现了一些,但是大部分内容都非常繁琐,并且从我的基本代码中偏离轨道导致混乱和浪费时间。
那就是说我知道我已经实现了如何实现,我只需要访问req.user
对象,我很确定它存储在会话变量中。我想提供我已经完成的工作,并弄清楚如何在用户登录会话中加入我的单页抽象应用程序(cordova / phonegap)。
在我使用的服务器端(node.js,express.js和passport.js)。我通常会允许express来呈现视图,但由于我使用的是CORS抽象应用程序,我不想通过AJAX调用将模板发送到客户端,因此我在客户端构建了视图,基本上就此而言无论HTML呈现什么,我都意识到我只需要有一个AJAX POST调用来登录用户,在我的服务器上调用POST路由来验证用户。
$(document).ready(function() {
$('body').on('submit', '#logIn', function(e){
e.preventDefault();
var formData = $(this).serialize();
$.ajax({
url: "http://mysite.io:3300/login",
data: formData,
type: "POST",
crossDomain: true,
dataType: "json",
success: function(data, textStatus, jqXHR) {
alert('succeeded!');
console.log('success')
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(textStatus, errorThrown);
console.log('error')
}
});
});
});
此时我的问题与护照req.user
对象有关。在CORS应用程序的客户端,会话并不完整,但似乎并不是因为客户端依赖于只有登录用户才能访问的api调用,我有这条路径。
me: function(req, res) {
if(req.user) {
var admin;
if(req.user.admin === true) {
admin = true;
}
var user = {
admin : admin,
user_id : req.user.id,
name : req.user.local.name,
email : req.user.local.email,
}
res.json(user);
} else {
res.redirect('/login');
}
}
我还有其他依赖req.user
对象的路由方法。所以最初的POST方法返回用户对象,比如名称等,因为我有一个看起来像这样的路由方法。
//cordova post method
app.post('/login', passport.authenticate('local-login'), function(req, res) {
if (req.user) {
console.log('is user');
res.send({ user: req.user });
}
else
console.log('is not user');
});
在此方法中,req.user
返回true,允许我访问req.user
对象和模板,因此在进行ajax POST调用时,我能够呈现用户配置文件。在此之后或在不同的路由调用上,该对象为false。
所以我的问题又是如何保存req.user
对象,以便我可以通过其他方法访问它,以便应用程序知道用户已登录,显然是存储在会话变量中,但是我很困惑实施它?
答案 0 :(得分:1)
我不知道您是如何处理CORS服务器端的,但您可能希望使用cors middleware来简化操作。无论哪种方式,您都需要确保将Access-Control-Allow-Credentials
标头设置为true
的值。
对于cors中间件,您所要做的就是在cors中间件配置中设置credentials: true
。否则,您可以通过res.header('Access-Control-Allow-Credentials', 'true');
您还需要将withCredentials
设置为true
,无论您何时进行任何ajax调用,都将发送Cookie。对于$.ajax
,你会这样做:
xhrFields: {
withCredentials: true
}
Angular的$http
服务设置类似。
之后,您应该会看到req.user
自动填充经过身份验证的会话。