invest-openapi icon indicating copy to clipboard operation
invest-openapi copied to clipboard

WebSocket frontend

Open mvkasatkin opened this issue 5 years ago • 23 comments

Здравствуйте!

Очень расстраивает отсутствие возможности законнектиться к websocket-api с фронтенда. JS WebSocket в браузерах не поддерживает передачу заголовков, в отличии от NodeJS, а соответственно, нет возможности передать токен. В обход проблемы пришлось поднимать бэкенд ради простого проксирования websocket-трафика. С REST Api проблем нет (CORS позволяет получить доступ). Было бы супер, если появится возможность альтернативной авторизации через браузерный вебсокет:)

mvkasatkin avatar Oct 23 '19 15:10 mvkasatkin

Привет!

У нас с предыдущим релизом появился стакан и свечи в REST-протоколе, возможно это сейчас поможет?

NikitaMelnikov avatar Oct 28 '19 10:10 NikitaMelnikov

@NikitaMelnikov, да, свечами, конечно, на данный момент можно решить вопрос. Но, получив определенные исторические данные, далее хотелось бы получать ивенты об изменении цены и просто обновлять локальную коллекцию, а не самому переполучать данные с определенным интервалом :) Так что, надеюсь, этот enhancement произойдет:)

mvkasatkin avatar Oct 28 '19 11:10 mvkasatkin

Поддерживаю @mvkasatkin Как вариант рассмотрите возможность передавать токен в URL или первым сообщением после открытие сокета.

alezhu avatar Feb 03 '20 20:02 alezhu

Кстати, для RestAPI включили CORS, что теперь тоже исключает возможность обращения к апи через браузер (без определенных приседаний). Есть ли в этом смысл? Локальные роботы вполне способны работать внутри браузера с использованием indexedDB, имея при этом визуализацию и отсутствие необходимости тянуть за собой и поддерживать излишний бэкенд. Но на данный момент CORS и WebSocket header auth мешают этому, без видимых на то причин. Было бы здорово, если данный вопрос будет решен.

mvkasatkin avatar Feb 04 '20 08:02 mvkasatkin

@mvkasatkin cors всегда включены были, но они именно включены, т.е. разрешены. Иначе сваггер бы не работал

NikitaMelnikov avatar Feb 04 '20 14:02 NikitaMelnikov

@NikitaMelnikov стоит ли ожидать альтернативный способ передачи токена через browser websocket (который не поддерживает кастомные заголовки)?

mvkasatkin avatar Mar 11 '20 03:03 mvkasatkin

Пока что не смогли реализовать безопасный способ передачи авторизационных параметров в query. Рекомендую пока что поднять локальный сервер на nodejs и проходить авторизацию через query в нем

NikitaMelnikov avatar Mar 13 '20 07:03 NikitaMelnikov

@NikitaMelnikov пока так и приходится делать. Но nodejs тут лишь костыль( Очень надеемся, что решение с авторизацией будет найдено. Как вариант, токен может быть передан единоразово, допустим с message auth. Далее на стороне сервера соединение будет считаться авторизованным.

mvkasatkin avatar Mar 13 '20 08:03 mvkasatkin

Тоже очень критичная проблема, хотелось бы получить решение. Может как-то связать авторизацию, которая прошла по https, и у вас на сервере на определенное время она будет считаться как пройденной и для websocket ?

SergeyBruhanov avatar Apr 23 '20 02:04 SergeyBruhanov

Может как-то связать авторизацию, которая прошла по https, и у вас на сервере на определенное время она будет считаться как пройденной и для websocket ?

Из-за технических особенностей такое невозможно

NikitaMelnikov avatar Apr 27 '20 05:04 NikitaMelnikov

Пробую передать токен следующим образом

Ошибка: Invalid or unexpected token

SergeyBruhanov avatar Apr 29 '20 10:04 SergeyBruhanov

ws = new WebSocket('wss://api-invest.tinkoff.ru/openapi/md/v1/md-openapi/ws', null, { headers: { Authorization: МОЙ_ТОКЕН}});

Authorization: "Bearer " + token https://tinkoffcreditsystems.github.io/invest-openapi/auth/

YuriyIlyin avatar Apr 29 '20 10:04 YuriyIlyin

@SergeyBruhanov

Браузерный WebSocket принимает 1-2 параметра. И заголовки к нему не добавить. Об этом, собственно, и тред.

alezhu avatar Apr 29 '20 10:04 alezhu

В третьем параметре же можно передать любые значения Пробую так

Ошибка: Authentication failed; no valid credentials available

Может дополнительные параметры заголовка не проверяются у Тинькофф ?

SergeyBruhanov avatar Apr 29 '20 10:04 SergeyBruhanov

@SergeyBruhanov можете посмотреть в DevTools, ваш токен не передаётся на сервер, как и другие не вебсокет заголовки, поэтому и ошибка. Об этом собственно и тред.

KirillKaverin avatar Apr 29 '20 12:04 KirillKaverin

JS WebSocket в браузерах не поддерживает передачу заголовков, в отличии от NodeJS, а соответственно, нет возможности передать токен.

Один заголовок все-таки передается - Sec-WebSocket-Protocol. Может в нем передавать, если использование не по назначению этого заголовка не критично со стороны Тинькова?

nonamegithub avatar Oct 07 '20 08:10 nonamegithub

Вопрос актуален насчет браузерного доступа к API

bymagnum avatar Oct 23 '20 08:10 bymagnum

У разрабов тинькова похоже проблемы с английским - не удостоили даже ответом, поэтому теперь подкидываю ссылку с идеей на русском. Токен отлично передается во втором аргументе - опробовал лично. Задача тиньковских спецов забрать его из Sec-WebSocket-Protocol и провести его авторизацию. Итак, вопрос: что мешает немного откостылить ваш бэкенд? Web socket прокси на node js как пятое колесо в телеге...

nonamegithub avatar May 26 '21 21:05 nonamegithub

Коллеги и разработчики! Зачем нужна авторизация для получения общедоступных данных (стакан, свечи, статус)?

polkila avatar Jul 07 '21 10:07 polkila

Коллеги и разработчики! Зачем нужна авторизация для получения общедоступных данных (стакан, свечи, статус)?

Потому что. Меня тоже этот вопрос беспокоит. Как и стабильность работы вебсокета. Бывает, что соединение висит, а сообщения перестают приходить. Приходится вешать таймер и перезапускать соединение. И все снова начинает доставляться

fly3110 avatar Nov 09 '21 12:11 fly3110

Коллеги и разработчики! Зачем нужна авторизация для получения общедоступных данных (стакан, свечи, статус)?

А с чего вы решили, что realtime-данные общедоступные?

Если по делу, то попробуйте распределить подписки по доступным 6 соединениям на пользователя и организовать на своей стороне keep-alive, reconnect + resubscribe (в случае потери связи). Более года все работает стабильно 99.9% времени.

mvkasatkin avatar Nov 09 '21 12:11 mvkasatkin

Коллеги и разработчики! Зачем нужна авторизация для получения общедоступных данных (стакан, свечи, статус)?

Такие данные как правило отдаются только с ключами API, и\или авторизацией. Просто так данные не возможно отдавать, дабы существуют на линии дорогостоящие проекты, которые будут висеть на шаре, которые будут топить канал... таких вариантов масса.

bymagnum avatar Nov 09 '21 12:11 bymagnum

Зачем нужна авторизация для получения общедоступных данных

Авторизация нужна, так как мы не имеем право транслировать котировки неопределенному кругу лиц. Только своим клиентам.

AlexanderVolkovTCS avatar Nov 09 '21 12:11 AlexanderVolkovTCS