我知道有很多关于这一点,但我真的没有找到我想要的东西。
所以我想让用户登录节点js,我使用express,mongo db,但最重要的是socket.io。所以我希望人们从我的index.html填写自定义表单:
app.get('/', function(req, res) {
fs.readFile(__dirname + '/../index.html', 'utf8', function(err, text){
res.send(text);
});
});
<form method="get" id="lala" >
<input type="text" name="user">
<input type="text" name="user">
<button id="button">KOKo</button>
</form>
点击按钮:
socket.emit('checkLogin', { my collected data from the form });
所以现在在服务器端我想检查这个用户名和密码,如果它们没问题,(我不知道它是怎么回事,但在php中我做SESSION['user_id']
(例如)所以之后当用户返回另一个请求时,我可以检查此会话,并且我知道用户已登录并且他可以看到该页面。
我确实看过passport.js mongo-db会话商店,但我没能让任何一个恶魔工作。我无法找到如何存储会话,如何检查会话以及所有这些东西。
所以,如果有人可以帮助我,并为我这样的白痴写下一个演示:
function check_auth_user(username,password,done,public_id){
var sql="SELECT * FROM `table` WHERE username = '"+ username +"' and password = '"+ password +"' limit 1";
connection.query(sql, function (err,results) {
if (err) throw err;
if(results.length > 0){
var res=results[0];
passport.serializeUser(function(res, done) {
done(null,res);
});
passport.deserializeUser(function(id, done) {
done(null,res);
});
return done(null, res);
} else {
return done(null, false);
}
});
}
但是现在如何将会话设置到商店以及我应该如何在此之后达到它?以及如何将它发送给从套接字io连接的正确用户: - )
答案 0 :(得分:3)
Passport会为您处理大部分内容。
首先,您误解了serializeUser
和deserializeUser
方法。您应该在应用程序初始化期间调用它们一次以注册全局帮助程序。 Passport将使用它们在身份验证后将用户对象序列化为user_id,并在每次用户访问API时将其序列化回用户对象。
passport.serializeUser(function(res, done) {
done(null, res.id);
});
passport.deserializeUser(function(id, done) {
var sql="SELECT * FROM `table` WHERE id = '"+ id +"' limit 1";
connection.query(sql, function (err, results) {
done(err, results[0])
});
});
因此,它使check_auth_user
功能非常简单:
function check_auth_user(username, password, done){
var sql="SELECT * FROM `table` WHERE username = '"+ username +"' and password = '"+ password +"' limit 1";
connection.query(sql, function (err, results) {
done(err, results[0])
});
}
passport.use(new LocalStrategy(check_auth_user));
app.post('/login', passport.authenticate('local', {
failureRedirect: '/login',
successRedirect: '/'
}));
Passport会自动将user_id
存储在快速会话中,并使用完整的反序列化用户填充req.user
,但您应确保启用express.session
和passport.session
个中间件。
app.use(express.session({
secret: "very secret",
store: new RedisStore() // or any other Store
}));
app.use(passport.session());
现在,您将能够使用req.user
访问您的用户对象:
app.get('/hello', function (req, res) {
if (req.user) {
res.send('Hello, ' + req.user.username + ', your id is ' + req.user.id);
} else {
res.send('Hello anonymous');
}
});