@TeslaCtroitel

Как поймать ошибку авторизации на кастомный namespace в Socket.IO 1.4.8?

UPD: для интересующихся ссылка на доки
Исходя из требований небольшого проекта решил применить Socket.IO. До этого с ним не работал, хотя с NodeJS знаком давно. Написал немного кода, всё работает как надо, да вот только надо перепроверять всё, что есть в сторонних гайдах, ибо они зачастую относятся к старой версии (<1.0). И вот на этом моменте произошёл затык с авторизацией.
Авторизация реализуется через middleware, всё по актуальной версии официальной документации:
io.use((socket, next)=>{
    var sidCookie = cookie.parse(socket.headers.cookie || '')['sid'];

    if(sidCookie === undefined){
        return next(new Error('not authorized'));
    }
    //........
});

На клиенте ошибка отлавливается так (в доках ничего на этот счёт нет, вроде бы):
socket.on('error', function(error){
    if(error == "not authorized"){
        //Redirect to login page
    }
});

И всё хорошо работает, пока мы не пытаемся подключится не на корневой namespace '/', а на какой-нибудь свой, пусть будет '/test/nsp'. Ошибка пропадает в никуда после next(error) и клиент-сервер продолжают спокойно швырятся друг в друга хартбитами. Окей, лезем в логи на клиенте. Выяснятся, что сервак нам ошибку переслал и потерялась она где-то на клиенте.
engine.io-client: socket socket receive: type "message", data "4"not authorized"" +5ms
socket.io-parser decoded 4"not authorized" as {"type":4,"nsp":"/","data":"not authorized"} +4ms
engine.io-client: polling polling +1ms
engine.io-client: polling-xhr xhr poll +1ms
engine.io-client: polling-xhr xhr open GET: http://test.com:10480/socket.io/EIO=3&transport=polling&t=LPLiIDy&sid=FihJFgV2CDLHdmY2AAAH +0ms
engine.io-client: polling-xhr xhr data null +1ms

С этого момента начинаются танцы с бубном и непонятки. Пробовал middleware авторизации (опять же по документации) прикрутить не к корневому, а к кастомному namespace:
io.of('/test/nsp').use((socket, next)=>{
    //........
});

Результат аналогичный, то бишь никакой. Кто встречался - отпишитесь, заранее спасибо. А я пока пошёл за бубном и кофе, как раскопаю клиентский код - тут отпишусь.
P.S.: Да, я знаю, что можно просто сделать socket.emit('not_authorized') и поймать на клиенте, но это как-то не по феншую и чёрт его знает к чему может привести.
P.S.S.: Node.JS 6.3.1, Socket.IO 1.4.8 (клиент той же версии), Windows 10, Chrome 51.0.2704.103
  • Вопрос задан
  • 299 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы