cex.io web socket身份验证时间戳错误

Posted

技术标签:

【中文标题】cex.io web socket身份验证时间戳错误【英文标题】:cex.io web socket Authentication timestamp error 【发布时间】:2017-07-09 17:22:36 【问题描述】:

我目前正在尝试连接到 CEX.IO 比特币交易所的 websocket。 Websocket 连接正常,但在身份验证时,出现错误:时间戳不在 20 秒范围内。我不知道这是什么错误。

createSignature 的测试用例 1 和 2 正常 (https://cex.io/websocket-api#authentication)。

计算签名和请求参数的代码

const WebSocket = require('ws');
const cexioWs = new WebSocket(
    'wss://ws.cex.io/ws/',
    
        perMessageDeflate: false
    
);
function createAuthRequest(apiKey, apiSecret) 
    let curTime = Math.floor(Date.now() / 1000);
    let hmac = crypto.createHmac('sha256', apiSecret);
    hmac.update(curTime.toString());
    hmac.update(apiKey);
    let args =
        
            e: "auth",
            auth: 
                key: apiKey,
                signature: hmac.digest('hex'), //createSignature(curTime, apiKey, apiSecret),
                timestamp: curTime
            
        ;
    let authMessage = JSON.stringify(args);
    console.log(args);
    return authMessage;

cexioWs.on('message', (mess, error) => 
    //console.log("connected");
    console.log("cexio message");
    console.log(mess);
    let JSONMess = JSON.parse(mess);
    if (JSONMess.e === "connected") 
        cexioWs.send(createAuthRequest(key, secret));
        cexioWs.send(JSON.stringify(
            e: "subscribe",
            roomss: [
                "tickers"
            ]
        ));
    
    if (JSONMess.e === "ping") 
        console.log("pong message");
        cexioWs.send(JSON.stringify(e: "pong"));
    
);

【问题讨论】:

【参考方案1】:

这是工作代码:

const crypto = require('crypto')
const WebSocket = require('ws')

var apiKey = ''
var apiSecret = ''

const cexioWs = new WebSocket('wss://ws.cex.io/ws/', perMessageDeflate: false );

function createSignature(timestamp, apiKey, apiSecret) 
    var hmac = crypto.createHmac('sha256', apiSecret );
    hmac.update( timestamp + apiKey );
    return hmac.digest('hex');


function createAuthRequest(apiKey, apiSecret )
    var timestamp = Math.floor(Date.now() / 1000);
    var args =  e: 'auth', auth:  key: apiKey,
        signature: createSignature(timestamp, apiKey, apiSecret), timestamp: timestamp  ;
    var authMessage = JSON.stringify( args );
    return authMessage;


cexioWs.on('message', (mess, error) => 
        console.log("cexio message");
        console.log(mess);
    let JSONMess = JSON.parse(mess);
    if (JSONMess.e === "connected") 
        cexioWs.send(createAuthRequest(apiKey, apiSecret));
        cexioWs.send(JSON.stringify(
            e: "subscribe",
            rooms: [
                "tickers"
            ]
        ));
    
    if (JSONMess.e === "ping") 
        console.log("pong message");
        cexioWs.send(JSON.stringify(e: "pong"));
    
);

【讨论】:

此代码也不起作用。给出错误消息 "e":"auth","data":"error":"Timestamp is not in 20sec range","ok" :"错误" 欧盟:维尔纽斯 UTC+02:00【参考方案2】:

不知道这是否有帮助,但我两天都遇到同样的问题,检查了所有内容,然后我检查了代码看起来非常好。后来我检查了我得到的实际时间,并将其与互联网时间进行了比较。我的电脑时间比 Internet 时间早 4 分钟,我的设置已关闭“从 Internet 更新时间”。

将我的计算机时间与 Internet 同步后,我运行了脚本,它运行良好。

故事的寓意,确保您的 PC 时间和 Internet 时间相同。 祝你好运!

【讨论】:

以上是关于cex.io web socket身份验证时间戳错误的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 中的身份验证

交易地点网址:www.cex.io(VB脚本)-创建自己的比特币交易机器人

在 socket.io 上,我是不是总是必须对每个 emit() 进行身份验证,而不仅仅是在建立连接时进行身份验证?

在建立连接之前使用后备传输进行 Socket.IO 身份验证

为 MariaDB 根用户启用密码和 unix_socket 身份验证?

无法让 JWT 身份验证与 socket.io 一起使用