javascript - 在某些操作或断开连接时识别用户

标签 javascript node.js socket.io jwt jwt-auth

我是 Node 新手

我有一个 PHP/Laravel cms,我有一个简单的 Nodejs 游戏服务器,它基本上是一个生成一些数字的循环

我通过 Socketio 将我的 PHP 后端连接到 Nodejs 并使用 Socketio-JWT识别用户

我的客户端(php/laravel)

PHP
$userToken = JWTAuth::customClaims(['userid' => Auth::user()->id, 'name' => Auth::user()->name, 'avatar' => asset_url('image/avatar-default.png')])->fromUser(Auth::user() );
html/js

        var socket = io.connect("http://localhost:666");

        socket.on('connect', function () {
            socket.emit('authenticate', {token: '{{$userToken}}'});
        });
        socket.on('authenticated', function () {
            console.log('Authenticated');
        });
        socket.on('unauthorized', function (data) {
            console.log('Unauthorized, error msg: ' + data.message);
        });


我的服务器端
const _online_users = { };
io.sockets

    .on('connection', socketioJwt.authorize({
        secret:  JWT_SECRET,
        timeout: 15000
    }))

    .on('authenticated', function(socket) {

        _online_users[socket.decoded_token.userid] = {
            name : socket.decoded_token.name ,
            avatar : socket.decoded_token.avatar ,
        }

        io.sockets.emit('update_online_users' ,  _online_users  );
            socket.on('disconnect', function() {
                 console.log(`----- @@disconnect -----`)
            });
    })  ;


如您所见,我有一个名为 _online_users 的对象我将经过身份验证的用户存储在此对象中,然后将其发送给客户端,以便他们知道谁在线
io.sockets.emit('update_online_users' , _online_users );
这是问题,当用户断开连接时
            socket.on('disconnect', function() {
                 console.log(`----- @@disconnect -----`)
            });

我必须更新我的 _online_users对象并删除断开连接的用户....我应该怎么做?我在想也许我可以将 token 本身存储在 _online_users
        _online_users[socket.decoded_token.userid] = {
           token  : socket.token ,
            name : socket.decoded_token.name ,
            avatar : socket.decoded_token.avatar ,
        }

当用户断开连接时,我从套接字中获取断开连接的 token 并通过该 token 从对象中删除用户

当然,这都是理论!我不确定这是否是要走的路....首先,我无法从套接字访问 token 本身!

或者假设一个用户向 Node 服务器发送另一个请求,我如何识别发送请求的用户?
    .on('authenticated', function(socket) {

            socket.on('somaction', function() {
                 console.log(` who is this guy ? `)
            });

    })

socket.decoded_token 有什么独特之处吗?我可以用作 id 吗?如果是这样,我可以将其存储在在线用户中,当用户请求某些内容时来回发送

基本上我迷路了,感谢任何指点

最佳答案

您现在可以在 socket-io 的较新版本中使用中间件.所以你可以通过jwt检查用户是否登录随请求发送的 token 。如果解码成功,您可以将用户信息分配给当前套接字并调用 next()并前往您正在收听的事件。这是 socket-io 文档中提供的示例,针对您的情况稍作修改。

io.use(function(socket, next) {
  const handshakeData = socket.request;
  // make sure the handshake data looks good as before
  // if error do this:
    // next(new Error('not authorized'));

  // else decode jwt token here and append the user to the socket.request
  // and call next
  // pseudo code here
  const {
         authorization
       } = handshakeData.header
  let token;

  if (authorization && authorization.split(" ")[0] === "Bearer") {
        token = authorization.split(" ")[1]
    }
  let user = jwt.decode(token, secret);
  socket.request.user = user;
  next();
});

关于javascript - 在某些操作或断开连接时识别用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62346981/

相关文章:

sockets - 在后台运行服务器,而应用程序执行其他操作

javascript - React 中的 OnClick 事件

javascript - 为什么没有执行带有 'if' 的 Promise 之后的 block?

json - Swift:如何使用来自 SocketIO emitWithAck 方法的响应

node.js - 为 Cordova 插件安装 Node 依赖项

node.js - 使用 Node.js 保护 API

javascript - 需要 IO 控制的基于浏览器的应用程序

javascript - 只显示我鼠标悬停的那些 div

javascript - 如何在 WebStorm 中转义括号?

javascript - 将具有位操作的Java代码从Java转换为JavaScript代码