socket.io 身份验证在第一个连接上不起作用
Posted
技术标签:
【中文标题】socket.io 身份验证在第一个连接上不起作用【英文标题】:socket.io authentification not working on first connection 【发布时间】:2017-05-29 13:27:24 【问题描述】:我有一个 NodeWebkit 客户端,它使用 socket.io 库 (javascript) 连接到 nodejs 服务器。
客户端在应用程序启动时启动连接过程,但服务器没有确认任何连接......虽然客户端的套接字的连接属性为“true”。
您应该知道我正在使用 socketio-jwt 来验证连接。 Github:https://github.com/auth0/socketio-jwt
我知道这种连接在某种程度上是有效的,因为如果我添加:
io.sockets.on('connection', function()console.log("hello");)
它打印你好!
因此,尽管以某种方式建立了连接,但似乎该事件不想对库进行身份验证部分,导致......嗯......什么都没有。
但这还不是全部!! 因为如果我重新启动应用程序(而不是服务器),那么大部分时间身份验证都可以工作!它就像一个竞争条件......但我不明白它怎么可能是一个......每个验证成功回调的代码行正在执行。
我尝试连接到远程服务器和本地主机。 我也尝试过使用其他套接字身份验证库,但我遇到了同样的问题。
这是服务器代码:
var session = require('express-session');
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var socketioJwt = require('socketio-jwt');
io.sockets.on('connection', socketioJwt.authorize(
secret: 'some secret',
timeout: 15000 // 15 seconds to send the authentication message
)).on('authenticated', function (socket)
console.log('[Info]: A user connected to socket = ', socket.decoded_token);
);
);
http.listen(5000, function ()
console.log('listening on *:5000');
);
现在是客户端代码:
this.socket = io.connect('http://' + that.hostName +':' + that.port);
var token = jwt.sign(email: "someEail", pwd: "somePwd", fromServerSecret);
this.socket.on('connect', function ()
that.socket.emit('authenticate', token: token) //send the jwt
.on('authenticated', function ()
console.log("[Info]: Socket login successfull");
)
.on('unauthorized', function (msg)
console.log("[Warning]: Socket unauthorized: " + JSON.stringify(msg.data));
throw new Error(msg.data.type);
);
);
从不显示服务器端日志“A user connected to socket”。 如果你有一个想法!感谢您的宝贵时间。
【问题讨论】:
【参考方案1】:为什么socket.emit(客户端)上有一个“那个”?我认为你应该在 socket.io 的同一个实例中处理它 - 使用与上面相同的“this”
【讨论】:
感谢您的回答。上面代码中没有出现的函数的第一行是“var that = this”。我在开始时保存了函数的范围。所以在第一层我可以使用“this”,因为它是根范围。然后我在“.on”的回调中,范围是回调的范围。这就是为什么我一开始就将范围保存在“那个”中。尽管我通过“那个”检查了套接字是否仍然可用,但确实如此。希望在所有这些“这个”和“那个”之后我所说的仍然有意义。 ;-) 这是有道理的。那么也许你应该尝试在服务器端嵌套套接字而不是链接它们,就像你在客户端所做的那样。以上是关于socket.io 身份验证在第一个连接上不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Node.js 和 socket.io 的 Redis 身份验证错误