我无法验证对WebSocket API的请求。
我正在使用的网站(www.bitmex.com)提供REST API和WebSocket API。
他们的两个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模块,用于向REST API发送请求,我已经定义了以下标题
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');
};
这适用于REST API,并且在我的应用程序的后端执行我需要的所有操作。
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.
我使用ng-websocket模块在AngularJS中实现了这一点。
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"});
我遇到的问题是无论如何都无法使用验证所需的ng-websocket发送标头。
如果我目前从浏览器中的另一个标签登录到BitMEX,则会连接,获取数据并按预期工作。
但是,如果我当前未登录该站点,则会抛出以下错误:
BitMEX: WS MESSAGE RECEIVED: {"status":401,"error":"Not authenticated.","meta":{},"request":{"op":"getAccount"}}
这里提供了一个python示例:https://github.com/BitMEX/market-maker/blob/master/test/websocket-apikey-auth-test.py通过身份验证过程, 但我还没有找到在AngularJS中实现这一目标的方法。
摘要
#1)当登录到BitMEX并且Websocket正在运行时,Chrome是否会以某种方式使用网站的Cookie来验证websocket请求?
在此处查看websockets的概述:http://enterprisewebbook.com/ch8_websockets.html 初始握手从" HTTP"升级连接。到WebSocket协议,
#2)由于此初始连接是通过HTTP进行的,是否有任何方法可以附加此初始HTTP请求所需的标头?