Vlad024
@Vlad024

Vue-Socket.io как передать заголовок токен авторизации и как проксировать подключение?

Привет. Помогите понять как работать с сокетами. Доки читал, интернет рыл, но на практике не работает. В документации к API нет JS примера по сокетам. Подключение по обычному REST проходит успешно, то есть токен рабочий.

Имеется внешний сокет сервер (openApi тинькофф) и токен авторизации.
Создан обычный проект через Vue Cli. Подключил плагин vue-socket.io
main.js
//....
import VueSocketIO from 'vue-socket.io'
import SocketIO from "socket.io-client"

const options = { 
  transportOptions: {
    polling: {
      extraHeaders: {
        Authorization: `Bearer ${token}`
      }
    }
  },
  // Такой вариант тоже пробовал
  // extraHeaders: {
  //   Authorization: `Bearer ${token}`
  // }
};

Vue.use(new VueSocketIO({
    debug: true,
    connection: SocketIO('wss://api-invest.tinkoff.ru/openapi/md/v1/md-openapi/ws', options),
  })
);
//...


Home.vue
sockets: {
      connect: function () {
          console.log('socket connected')
      }
  },

Функция connect не срабатывает
В консоле видно следующее.
5ee2be475ca06719708324.png

======
Тут я подумал дай вообще проверю подключение по нативному сокету и к официальному тестовому серверу ws.

в Home.vue добавил
created() {
    let socket = new WebSocket("wss://echo.websocket.org");
    socket.onopen = function() {
      console.log("Соединение установлено.");
    };
  },

Подключение сработало.

Меняю урл на тинькофф
let socket = new WebSocket("wss://api-invest.tinkoff.ru/openapi/md/v1/md-openapi/ws");

Ожидаемо получаю ошибку в авторизации
5ee2d0ad6cba2813172186.png

Пошел гуглить как передать токен. Наткнулся на этот вопрос и тут еще.
Пробую
let socket = new WebSocket("wss://api-invest.tinkoff.ru/openapi/md/v1/md-openapi/ws", ["Authorization", token]);

Получаю ошибку.
5ee2d3c5bd313781982258.png

Тут я сдался :). не знаю как дальше быть.

До этого, еще при использовании плагина пытался проксировать через vue.config.js чтобы обойти CORS (для сокетов так можно вообще?) не сработало.
module.exports = {
	devServer: {
        proxy: {
          '^/': { 
            target: 'wss://echo.websocket.org'
          }
        }
    }
}

//... main.js
connection: SocketIO('http://localhost:8080', options),

После этих изменений в консоле браузера выдает 500 ошибку
GET http://localhost:8080/socket.io/?EIO=3&transport=polling&t=NAbvfZ8 500 (Internal Server Error)

В консоле редактора Vue тоже ругается
Proxy error: Could not proxy request /socket.io/?EIO=3&transport=polling&t=NAbw8kS from localhost:8080 to wss://echo.websocket.org.
See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (ECONNRESET).

ECONNRESET это значит соединение было принудительно закрыто узлом. Обычно это происходит из-за потери соединения на удаленном сокете из-за тайм-аута или перезагрузки. Обычно встречаются через http и net модули.

Компетенции еще мало, надеюсь на помощь.
Сори за длинный вопрос, хотел подробнее.
  • Вопрос задан
  • 2232 просмотра
Пригласить эксперта
Ответы на вопрос 2
WinPooh32
@WinPooh32
Stack Overflow answer searching expert
Для вебсокетов нельзя задавать заголовки из браузера.
Можно передавать токен через ссылку или через куки.
Ответ написан
@Ark-Iv
transport=polling - явно не websocket поэтому ошибка 500
у socket.io два протокола и оно вроде как само должно переключитьcя на WS, но можно и принудительно задать первым использовать websoket.
потом где то проскакивало, что и websoket какой то не такой у socket.io
почти все есть у них на сайте,
где то там https://socket.io/docs/#Using-it-just-as-a-cross-b...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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