AngularJS:通过Websocket发送身份验证标头

时间:2015-11-17 23:49:08

标签: angularjs node.js authentication websocket

我无法验证对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请求所需的标头?

1 个答案:

答案 0 :(得分:0)

如果您阅读Python示例,它发送的第一件事是{"op": "authKey", "args": [API_KEY, nonce, signature]},然后它会发送{"op": "getAccount"}

Python示例line #44line #51

Chrome如何做到这是另一个问题。