я только настроил мой экспресс (4.x) + Socket.io (1.x) + angular.js приложение и мое приложение выглядитРозетки всегда не прошел проверку подлинности
Экспресс
app.use(session({secret:"mysecret",store:new RedisStore({ host: 'localhost', port: 6379, client: redis }), cookie: {httpOnly: false,secure: false}}));
конфигурации Socket.io
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
// If you use [email protected] the callback looks different
accept();
}
function onAuthorizeFail(data, message, error, accept){
if(error) throw new Error(message);
return accept();
}
io.use(passportSocketIo.authorize({
passport:passport,
cookieParser: cookieParser,
key: 'connect.sid', // the name of the cookie where express/connect stores its session_id
secret: 'mysecret', // the session_secret to parse the cookie
store: new RedisStore({ host: 'localhost', port: 6379, client: redis }),
success: onAuthorizeSuccess, // *optional* callback on success - read more below
fail: onAuthorizeFail // *optional* callback on fail/error - read more below
}));
Все работает правильно, сеансы сохраняются в Redis, мой экспресс-приложение говорит req.isAutheticated() = true
.
Но:
io.sockets.on('connection', function (socket) {
console.log(socket.request.user);
socket.on('disconnect',function(){
console.log('User disconnected');
});
});
говорит logged_in = false
.
Мой угловой код выглядит следующим образом (getCookie ('connect.sid') имеет правильное значение)
var socket = io.connect('ws://chipso.eu:3000/',{
query: 'session_id=' + getCookie('connect.sid')
});
return {
on: function (eventName, callback) {
socket.on(eventName, function() {
var args = arguments;
$rootScope.$apply(function() {
callback.apply(socket, args);
});
});
},
emit: function (eventName, data, callback) {
socket.emit(eventName, data, function() {
var args = arguments;
$rootScope.$apply(function() {
if (callback) {
callback.apply(socket, args);
}
});
})
}
};
Мой rediss магазин выглядит как
{"cookie":{"originalMaxAge":2591999999,"expires":"2014-10-20T19:06:23.097Z","secure":false,
"httpOnly":false,"path":"/"},"passport":{"user":{"id":1,"name":"Filip Lukáč","first_name":"Filip",
"last_name":"Lukáč","gender":"male","reg_date":"2014-09-15 11:57:34.079","username":"[email protected]",
"role":"admin","photo":"https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xpa1/v/t1.0-1/p100x100/
10645292_334651976702411_6704623329146986982_n.jpg?oh=a5ed18ae84dfc3909b4bfb036a0a2b8d&
oe=548BC691&__gda__=1419568684_70705b96aaa90cf986992372925d442e","logged":true}}}
Вот мой журнал отладки.
_query:
{ session_id: 's:uhckQqqa4XdGEtOHg0EwrumGdRDYoa9C.QEWbVG1/w3aqH7WJ97YSTisZuKlZvQd1rYJvV92L2Gs',
EIO: '3',
transport: 'polling',
t: '1411242792055-0' },
res:
{ domain: null,
_events: { finish: [Function] },
_maxListeners: 10,
output: [],
outputEncodings: [],
writable: true,
_last: false,
chunkedEncoding: false,
shouldKeepAlive: true,
useChunkedEncodingByDefault: true,
sendDate: true,
_headerSent: true,
_header: 'HTTP/1.1 200 OK\r\nContent-Type: application/octet-stream\r\nContent-Length: 101\r\nAccess-Control-Allow-Origin: *\r\nSet-Cookie: io=ET-vPrTRy078bMyiAAAD\r\nDate: Sat, 20 Sep 2014 19:53:10 GMT\r\nConnection: keep-alive\r\n\r\n',
_hasBody: true,
_trailer: '',
finished: true,
_hangupClose: false,
socket: null,
connection: null,
statusCode: 200 },
cleanup: [Function: cleanup],
read: [Function],
socketio_version_1: true,
cookie: { 'connect.sid': 'uhckQqqa4XdGEtOHg0EwrumGdRDYoa9C' },
sessionID: 's:uhckQqqa4XdGEtOHg0EwrumGdRDYoa9C.QEWbVG1/w3aqH7WJ97YSTisZuKlZvQd1rYJvV92L2Gs',
user: { logged_in: false } }
Сессия не найдена, { logged_in: false }
. И сообщение в моем onAuthorizeFail
говорит = No session found
.
Я не могу понять, где проблема ... Может ли кто-нибудь мне помочь?
Я просто хочу, чтобы увидеть, если моя проверку подлинности пользователя
https://github.com/jfromaniello/passport.socketio/pull/82 –
В вашем «исправлении» удаляется только опция для чтения идентификатора сеанса из 'data.query.session_id' и' data._query.session_id' , Если они были пустыми, чтобы начать с вашего 'sessionID', они были бы получены из' data.cookie [auth.key] 'anyways. – vesse
@vesse прав .. единственный способ, которым это может что-то изменить для вас, это если вы отправляете 'session_id'. –