Javascript 解析服务器登录返回用户,但req.user未定义
我正在尝试使用Parse Server设置一个简单的身份验证系统: app.jsJavascript 解析服务器登录返回用户,但req.user未定义,javascript,node.js,express,parse-server,Javascript,Node.js,Express,Parse Server,我正在尝试使用Parse Server设置一个简单的身份验证系统: app.js ... app.get('/login', (req, res) => { res.render('login.ejs'); }); app.post('/login', (req, res) => { console.log('POST /login\t' + util.inspect(req.body)); driver.login(req, (err, user) =&
...
app.get('/login', (req, res) => {
res.render('login.ejs');
});
app.post('/login', (req, res) => {
console.log('POST /login\t' + util.inspect(req.body));
driver.login(req, (err, user) => {
//Here, user is defined
if(err) {
res.redirect('/login');
} else {
res.redirect('/user');
}
});
});
...
driver.js:
...
function login(req, callback) {
var username = req.body.username,
password = req.body.password;
Parse.User.logIn(username, password, {
success: (user) => {
callback();
},
error: (user, error) => {
callback(JSON.stringify(error));
}
});
}
function isLoggedIn(req, callback) {
console.log('isLoggedIn?');
console.log(util.inspect(req.user)); //undefined
if(req.user) {
callback();
} else {
callback('Not logged in');
}
}
...
当我访问/login
时,我可以很好地登录,并且被重定向到/user
,没有任何错误,但是在/user
上,使用isLoggedIn
作为中间件,req.user
是未定义的
我见过其他人在搜索时也有同样的问题,但帖子中要么是old(你有两条路由要走,要么是REST full服务器,这意味着用户在路由调用、状态完全和使用会话之间不会持久 幸运的是,已经构建了一个非常好的nodejs身份验证中间件,可以处理所有会话管理。这称为passportJS。可以在此处找到文档: 您不仅可以通过本地登录进行身份验证,还可以支持使用google、facebook、github等进行身份验证。这是通过所谓的策略实现的。您可以使用google策略创建google oauth,使用facebook stradegy创建facebook oauth等 您需要的是一种本地策略,之所以称为此策略,是因为您希望使用本地用户凭据进行身份验证。此策略可在此处找到: 您将需要passport和passport local,只需运行即可安装
npm install passport passport-local
从这里开始,只需浏览我在上面链接的文档,了解如何设置所有内容。我对Bla comment的回答,他问我最终使用了什么 在我的例子中,我正在开发一个RESTAPI,会话数据在连接后不会改变 因此,我所做的是将会话委托给客户机,并通过使用完全无状态 当客户端经过身份验证时,我会在Json Web令牌中加密他的会话数据,并发送给他。当他尝试访问受保护的页面时,他会发送JWT给我,我可以解密JWT,并根据其中的信息重新创建
req.user
我的中间件如下所示:
function isLoggedIn(req, res, next) {
//If there is a token
if(req.headers != null && req.headers.token != null) {
//Verify it and extract the user's data
verify(req.headers.token, (err, user) => {
if(err != null) {
res.status(401);
res.json({error: err});
} else {
//Recreate req.user
req.user = user;
next();
}
});
} else {
res.status(401);
res.json({error: 'No token'});
}
}
function verify(token, callback) {
//Verify the token
jwt.verify(token, jwtSecret, (error, user) => {
if(error != null) {
callback(error);
} else {
Separately check if logged into Parse
parse.isLoggedIn(user, (error, loggedIn) => {
if(error != null) {
callback(error);
} else if(!loggedIn) {
callback('Not logged in the Parse');
} else {
callback(null, user);
}
});
}
});
}
我知道passport,问题是在身份验证之后,我想使用Parse,所以passport不是一个真正的解决方案。@DrakaSAN您最终是如何解决这个问题的?您是按照建议使用Passeport还是有更好的做法?我的情况完全相同。@bla:作为答案发布:)DrakaSAN-您希望如何在会话中支持会话和存储数据?正如@sookool99所提到的,您还需要一个抽象层。