【发布时间】:2020-10-02 10:20:11
【问题描述】:
我是节点新手
我有一个 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 对象并删除断开连接的用户....我应该怎么做?我在想也许我可以将令牌本身存储在_online_users
_online_users[socket.decoded_token.userid] = {
token : socket.token ,
name : socket.decoded_token.name ,
avatar : socket.decoded_token.avatar ,
}
当用户断开连接时,我从套接字中获取断开连接的令牌,并通过该令牌将用户从对象中删除
当然,这都是理论!我不确定这是否是要走的路....首先,我无法从套接字访问令牌本身!
或者假设一个用户向节点服务器发送另一个请求,我如何识别发送请求的用户?
.on('authenticated', function(socket) {
socket.on('somaction', function() {
console.log(` who is this guy ? `)
});
})
socket.decoded_token 有什么独特的东西可以用作 id 吗?如果是这样,我可以将其存储在用户请求某些内容时来回发送的在线用户中
基本上我迷路了,感谢任何指点
【问题讨论】:
-
我的英语不好,无法帮你,但我的广告系统中也有同样的套路。就我而言,我在redis服务器上使用了一个集合,但我不会立即断开用户连接,我会对其进行操作并在一段时间内多次发送socket.emit,如果它没有响应我的平。 redis 服务器成员的集合,并与它们在另一个集合中的连接数据一起被删除。
-
您能对我的回答提供一些反馈吗?
标签: javascript node.js socket.io jwt jwt-auth