Parse Server 登录 return 用户,但 req.user 未定义
Parse Server login return a user, but req.user is undefined
我正在尝试使用 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) => {
//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
未定义。
我看到其他人在搜索时遇到了同样的问题,但是 post 要么是旧的(<2015),要么是使用了 JSSDK 的另一部分(react/browser),要么就是没有得到任何答案。
我知道我可以使用 session,并且每次都基于它重新创建用户,但感觉真的很老套,这真的是受支持的方式吗?
您有两条路要走,要么有一个 REST-full 服务器,这意味着用户在路由调用、STATE-full 和使用会话之间不是持久的。
幸运的是,已经构建了一个非常好的 nodejs 身份验证中间件,它将处理所有这些会话管理。这称为 passportJS。可以在此处找到文档:http://passportjs.org/docs
您不仅可以通过本地登录进行身份验证,还支持使用 google、facebook、github 等进行身份验证。这是通过所谓的策略来完成的。您使用 google-strategy 获得 google oauth,facebook-stradegy 获得 facebook oauth,等等
您要寻找的是本地策略,之所以这样称呼是因为您想使用本地用户凭据进行身份验证。这个策略可以在这里找到:https://www.npmjs.com/package/passport-local
你需要护照和本地护照,安装简单 运行
npm install passport passport-local
从那里开始,只需阅读我上面链接的文档,了解如何设置所有内容。
开发我对 blablabla 评论的回答,谁问我最终使用了什么。
在我的例子中,我正在开发一个 REST API,会话数据预计不会在连接后发生变化。
所以我所做的是将会话委托给客户端,并通过使用 JWT 实现完全无状态。
当客户端通过身份验证后,我在 Json Web Token 中加密他的会话数据,然后发送给他。当他尝试访问受保护的页面时,他将 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);
}
});
}
});
}
我正在尝试使用 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) => {
//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
未定义。
我看到其他人在搜索时遇到了同样的问题,但是 post 要么是旧的(<2015),要么是使用了 JSSDK 的另一部分(react/browser),要么就是没有得到任何答案。
我知道我可以使用 session,并且每次都基于它重新创建用户,但感觉真的很老套,这真的是受支持的方式吗?
您有两条路要走,要么有一个 REST-full 服务器,这意味着用户在路由调用、STATE-full 和使用会话之间不是持久的。
幸运的是,已经构建了一个非常好的 nodejs 身份验证中间件,它将处理所有这些会话管理。这称为 passportJS。可以在此处找到文档:http://passportjs.org/docs
您不仅可以通过本地登录进行身份验证,还支持使用 google、facebook、github 等进行身份验证。这是通过所谓的策略来完成的。您使用 google-strategy 获得 google oauth,facebook-stradegy 获得 facebook oauth,等等
您要寻找的是本地策略,之所以这样称呼是因为您想使用本地用户凭据进行身份验证。这个策略可以在这里找到:https://www.npmjs.com/package/passport-local
你需要护照和本地护照,安装简单 运行
npm install passport passport-local
从那里开始,只需阅读我上面链接的文档,了解如何设置所有内容。
开发我对 blablabla 评论的回答,谁问我最终使用了什么。
在我的例子中,我正在开发一个 REST API,会话数据预计不会在连接后发生变化。
所以我所做的是将会话委托给客户端,并通过使用 JWT 实现完全无状态。
当客户端通过身份验证后,我在 Json Web Token 中加密他的会话数据,然后发送给他。当他尝试访问受保护的页面时,他将 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);
}
});
}
});
}