【问题标题】:Assign passport.js user data to socket.io将passport.js用户数据分配给socket.io
【发布时间】:2018-01-08 02:54:42
【问题描述】:

我使用passport.js 提供用户注册和登录。用户登录成功后,可以进入聊天室,聊天室是socket.io。我想使用 socket.io 显示通过护照登录的用户名。这是我的代码:

服务器端socket.io

io.on('connection', function(socket) {
    io.emit('user connect'); 
}); 

客户端

<!doctype html>
 <html>
  <head>
    <title>Socket.IO chat</title>
    <script src="/socket.io/socket.io.js"></script>
    <script src="https://code.jquery.com/jquery-1.11.1.js"></script>
    <script>
        $(document).ready( function () {
            var socket = io();            
            socket.on('user connect', function () {
                $('#loggedUsers').append($('<li>').text(username)); <!-- right username is what I can't figure out how to do -->
            });
        });
    </script>
    </head>
    <body>
     <ul id="loggedUsers" >
        <li> username.. </li>
        ...
     </ul>
    </body>
</html>

以及人们如何获得html 文件:

编辑:添加了中间件 isLoggedIn,我之前忘记添加了

router.get('/chatroom', isLoggedIn, function(req, res) {
    console.log(req.user.username); //exactly what I want
    res.sendFile(path.join(__dirname, '../views', 'chatroom.html'));
});

怎么做?

注意:我的chatroom.html 没有用户名表单


解决了。
我发现了passport.socketio 模块,它做了我想要的。 https://www.npmjs.com/package/passport.socketio

【问题讨论】:

标签: javascript node.js socket.io passport.js


【解决方案1】:

.emit 接受多个参数:

服务器:

io.emit('user connect', data);

客户:

socket.on('user connect', function (data) {
// ...

关于如何获取套接字中的数据,这里有一种使用 JWT 令牌的方法,取自here

注意:jwtSecret 是您仅存储在服务器上的密钥。登录和套接字 IO 部分使用相同的。

服务器端(登录时):

var jwt = require('jsonwebtoken');

app.post('/login', function (req, res) {

  // validate the actual user
  var user = ...;

  // put user in a token signed with secret key
  var token = jwt.sign(user, jwtSecret, { expiresInMinutes: 60*5 });

  // send token as response or in any other way so the client can store it
  res.json({token: token});
});

将您从客户端登录响应中获得的令牌保存到localstorage

服务器端(socket.io):

var socketioJwt = require('socketio-jwt');

var sio = socketIo.listen(server);

sio.set('authorization', socketioJwt.authorize({
  secret: jwtSecret, // same secret key here
  handshake: true
}));

sio.sockets
  .on('connection', function (socket) {
     // will only connect if the user is a valid user
     var user = socket.handshake.decoded_token;
     // ...
  });

客户端:

localstorage获取令牌,然后:

var socket = io.connect('', {
  query: 'token=' + token
});

socket.on('connect', function () {
  console.log('authenticated');
}).on('disconnect', function () {
  console.log('disconnected');
});

更多信息请阅读实际文章,这是基本流程。

【讨论】:

  • 用户登录后,我确实在令牌中发送了用户配置文件。但现在我从另一个文件运行socket.iochatroom.html。我仍然需要以某种方式获取用户数据,但不知道如何......(它是客户端的 io.connect() )。所以我再次处于起始位置:/
  • @PetarD。您需要以某种方式保存令牌(本地存储、会话存储等),然后将其与您的请求一起发送,以便服务器知道用户是谁。
  • 是的,但我不知道该怎么做。用户已经使用护照登录了,我不能让他在聊天室页面上再次写下他的用户名和密码
  • @PetarD。我已经从我现在链接的文章中添加了基础知识,请实际阅读以获取更多信息。
  • 你怎么判断我没读过?我做了几次。 query: 'token=' + token - 令牌是函数connect_socket 的参数,它来自POST 请求,我的html 中没有,不知道如何没有它,这就是我问的。与其从您发送的链接中复制代码并傲慢自大,不如您实际上可以阅读我的问题。
猜你喜欢
  • 2017-09-18
  • 2019-11-30
  • 2014-07-16
  • 2020-11-10
  • 2014-04-07
  • 1970-01-01
  • 2014-07-17
  • 2018-10-25
  • 1970-01-01
相关资源
最近更新 更多