2014-09-20 4 views
0

я только настроил мой экспресс (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.

Я не могу понять, где проблема ... Может ли кто-нибудь мне помочь?

Я просто хочу, чтобы увидеть, если моя проверку подлинности пользователя

ответ

0

EDIT:

я использовал для создания тянущего-запроса. Если кто-то использует RedisStore, проверьте это.

Pull-request

Проблема в passport.socketio библиотеке

https://github.com/jfromaniello/passport.socketio/blob/master/lib/index.js#L57 Вот, когда я пытаюсь найти свою сессию в RedisStore.

sessionID = data.query.session_id. 

Но сеансы хранятся

session.cookie[auth.key]. 

Так я переписаны эту линию от

data.sessionID = (data.query && data.query.session_id) || (data._query && data._query.session_id) || data.cookie[auth.key] || ''; 

в

data.sessionID = data.cookie[auth.key] || ''; 

ПРЕДУПРЕЖДЕНИЕ: Это может быть решена только для RedisStore().

+0

https://github.com/jfromaniello/passport.socketio/pull/82 –

+0

В вашем «исправлении» удаляется только опция для чтения идентификатора сеанса из 'data.query.session_id' и' data._query.session_id' , Если они были пустыми, чтобы начать с вашего 'sessionID', они были бы получены из' data.cookie [auth.key] 'anyways. – vesse

+0

@vesse прав .. единственный способ, которым это может что-то изменить для вас, это если вы отправляете 'session_id'. –

 Смежные вопросы

  • Нет связанных вопросов^_^