【问题标题】:User authification with node js使用节点 js 进行用户身份验证
【发布时间】:2015-01-07 16:14:21
【问题描述】:

我知道这方面有很多线索,但我真的没有找到我要找的东西。

所以我想让用户使用节点 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 连接的正确用户 :-)

【问题讨论】:

  • 解释如何在express中使用会话-blog.modulus.io/nodejs-and-express-sessions
  • 感谢您编辑我的帖子 :-)。好的,这终于是一个非常非常好的演示,我可以了解更多关于会话的信息。现在我可以问我如何在我的套接字函数中达到这个“req”参数。因为我得到的唯一参数只是我不知道如何返回的套接字,所以我可以控制台记录他。当我尝试时,我得到:TypeError: Converting circular structure to JSON at Object.stringify (native)

标签: node.js express passport.js


【解决方案1】:

Passport 为您处理大部分工作。

首先,您误解了serializeUserdeserializeUser 方法。您应该在应用程序初始化期间调用它们一次以注册全局帮助程序。 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 存储在 express 会话中,使用完全反序列化的用户填充 req.user,但您应确保启用 express.sessionpassport.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');
  }
});

【讨论】:

  • 我知道这个问题真的很可笑,但是 - 我真的不明白现在'check_auth_user'和'passport'之间的联系是什么。这个功能完成了吗?如果是的话,你能给我一个关于它的文档的链接:-)。如果你知道的话,还有如何在 socket.io 函数中获取这个参数“req”。
  • 看来我错过了您使用 socket.io 而不是 http 调用的部分。您可能需要一些额外的模块来通过socket.io 处理身份验证。你应该看看passport.socketio modulethis question
  • 啊,好的,但我现在得走了,今晚我会测试它,但我觉得我测试它似乎很复杂,即使演示看起来很简单 :-)。我认为问题是我需要不同版本的 socket.io 来完成这项工作,而不仅仅是模块。或者可能是我弄错了。
  • 其实我不确定passportsocket.io的好选择。我的回答是基于错误的假设,即您使用的是 HTTP 和 express。
猜你喜欢
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 2019-03-16
  • 2015-04-28
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多