У меня возникли трудности с аутентификацией запросов к API WebSocket.AngularJS: Отправка заголовков аутентификации через Websocket
Сайт, на котором я работаю (www.bitmex.com), предоставляет API REST и API WebSocket.
Оба их API позволяют аутентификацию с помощью ключа API.
аутентификации Требования
API-интерфейс предоставляет следующую документацию для проверки подлинности с API ключами:
Authentication is done by sending the following HTTP headers:
api-expires: a UNIX timestamp in the future (eg: 5 seconds).
api-key: Your public API key. This the id param returned when you create an API Key via the API.
api-signature: A signature of the request you are making. It is calculated as hex(HMAC_SHA256(verb + url + nonce + data)).
REST API
Я создал модуль NodeJS для отправки запросов на API REST, я определил следующие заголовки:
headers = {
"User-Agent": "BitMEX NodeJS API Client",
"api-expires": expires,
"api-key": this.api_key,
"api-signature": this.signMessage(verb, reqUrl, expires, params)
};
where the signMessage function looks like:
BitMEX.prototype.signMessage = function signMessage(verb, url, nonce, data) {
if (!data || _.isEmpty(data)) data = '';
else if(_.isObject(data)) data = formatParameters(data);
return crypto.createHmac('sha256', this.secret).update(verb + url + nonce + data).digest('hex');
};
Это отлично работает для API REST и делает все, что мне нужно, в бэкэнд приложения.
WebSocket API
Я пытаюсь использовать WebSocket получить в реальном времени данных и отображать его в интерфейсе на основе браузера.
Документация на сайте гласит:
To use an API Key with websockets, you must sign the initial upgrade request in the same manner you would sign other REST calls.
Я реализует это в AngularJS с помощью модуля нг-WebSocket.
exchange.dataStream = $websocket('wss://testnet.bitmex.com/realtime');
exchange.dataStream.onMessage(function incoming (message) {
console.log("BitMEX: WS MESSAGE RECEIVED: " + message.data);
// .. handle data here ...
});
exchange.dataStream.send({"op":"getAccount"});
Проблема, с которой я столкнулся, я не могу найти в любом случае для отправки заголовков с помощью нг-WebSocket, которые необходимы для проверки подлинности.
Если я сейчас вхожу в систему с BitMEX с другой вкладки в своем браузере, это будет соединяться, получать данные и работать должным образом.
Однако, если я не вошел на сайт, он будет бросать следующее сообщение об ошибке:
BitMEX: WS MESSAGE RECEIVED: {"status":401,"error":"Not authenticated.","meta":{},"request":{"op":"getAccount"}}
Существует пример питона, представленный здесь: https://github.com/BitMEX/market-maker/blob/master/test/websocket-apikey-auth-test.py, что проходит через процесс аутентификации, но я не нашли способ сделать это в AngularJS.
Резюме
# 1) При входе в систему, чтобы BitMEX и WebSocket работает, является Chrome как-то с помощью куки веб-сайта для проверки подлинности запросов WebSocket?
Глядя на обзор WebSockets здесь: http://enterprisewebbook.com/ch8_websockets.html Начальное рукопожатие модернизирует соединение с «HTTP» для протокола WebSocket,
# 2) Поскольку это первоначальное соединение через HTTP, есть ли способ для прикрепления заголовков, необходимых для этого первоначального HTTP-запроса?
Если вы читаете пример Python, то первое, что он отправляет, это '{" op ":" authKey "," args ": [API_KEY, nonce, signature]}', после чего он отправляет '{" op ":" getAccount "}' – georgeawg
Пример Python [строка # 44] (https://github.com/BitMEX/market-maker/blob/master/test/websocket-apikey-auth-test.py#L44) и [строка # 51] (https://github.com/BitMEX/market-maker/blob/master/test/websocket-apikey-auth-test.py#L51) – georgeawg
Спасибо. Это помогает, я могу использовать его для аутентификации запроса сейчас :). Мне все еще интересно узнать, как проверяется запрос WebSocket, когда я вошел в систему на другой вкладке в chrome без создания подписи. –