2015-11-17 3 views
0

У меня возникли трудности с аутентификацией запросов к 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-запроса?

+1

Если вы читаете пример Python, то первое, что он отправляет, это '{" op ":" authKey "," args ": [API_KEY, nonce, signature]}', после чего он отправляет '{" op ":" getAccount "}' – georgeawg

+1

Пример 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

+0

Спасибо. Это помогает, я могу использовать его для аутентификации запроса сейчас :). Мне все еще интересно узнать, как проверяется запрос WebSocket, когда я вошел в систему на другой вкладке в chrome без создания подписи. –

ответ

0

Если вы читаете пример Python, то первая вещь, которую он посылает это {"op": "authKey", "args": [API_KEY, nonce, signature]} то он посылает {"op": "getAccount"}

пример Python line #44 и line #51

Как Chrome делает это другой вопрос.

+0

Отключить cookies и посмотреть, не зашла ли новая вкладка. Также откройте окно инкогнито и обратите внимание, что вы больше не вошли в систему. – georgeawg

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