我有一个实时应用程序,可以使用express + passportJS并且无需套接字身份验证。 当我添加passport.socketio时,我的问题是套接字只会在我重新启动服务器时连接...
我有护照和护照在服务器端和客户端的passport.socketio我有btford.socket-io的angularjs:
angular.module('Socket', ['btford.socket-io'])
.factory('socket',['socketFactory', function(socketFactory){
var myIoSocket = io.connect("http://192.168.0.7:8080");
mySocket = socketFactory({
ioSocket: myIoSocket
});
return mySocket;
}]);
当用户登录时,我正在socket.connect();
。
这似乎没有在服务器端做任何事情,我没有看到任何日志...
这是按照教程实现的passport.socketio
的实现var io = require('socket.io').listen(app.listen(port));
var passportSocketIo = require("passport.socketio");
io.use(passportSocketIo.authorize({
cookieParser: cookieParser,
secret: 'secret',
store: sessionStore,
success: onAuthorizeSuccess,
fail: onAuthorizeFail,
}));
function onAuthorizeSuccess(data, accept){
log.debug('successful connection to socket.io');
return accept();
}
function onAuthorizeFail(data, message, error, accept){
log.debug('unsuccessful connection to socket.io');
if(error){
throw new Error(message);
}
return accept(new Error(message));
}
奇怪的是,当我重新启动服务器时,我可以看到很多日志消息,显示我现在尝试连接的所有套接字实际连接。
然后它似乎让用户通过套接字交换并按预期工作。
任何人都知道可能会发生什么?
答案 0 :(得分:0)
当客户端打开页面时,客户端将连接,然后初始化握手。然后服务器检查身份验证并强制断开连接。然后,服务器不会检查同一套接字连接的身份验证(不初始化握手)。您必须从客户端强制建立新连接。
socket = io.connect(SOCKET_URL, {forceNew: true});
您的代码
var myIoSocket = io.connect("http://192.168.0.7:8080",{forceNew: true});
我有同样的问题,这解决了我的问题。如果强制建立新连接,我希望以前的所有事件监听器都会丢失。您必须再次添加事件侦听器。