Coinbase Pro身份验证:没有有效的签名

时间:2020-02-15 12:22:03

标签: javascript coinbase-api

我正在尝试从Google脚本向Coinbase Pro进行身份验证。我已经在Postman中使用CryptoJS做到了这一点,但是遇到了问题generating the CB-ACCESS-SIGN signature header。我已经使用测试密钥和秘密字符串进行了测试,以找出Google提供的实现CryptoJS.HmacSHA256Utilities.computeHmacSha256Signature之间的区别,并注意到参数的不同:CryptoJS.HmacSHA256需要一个秘密作为WordArray,而Utilities.computeHmacSha256Signature希望将秘密作为字符串。

在邮递员中,我正在执行以下操作以使apiSecret的字数组传递给CryptoJS.HmacSHA256:

var hash = CryptoJS.enc.Base64.parse(pm.variables.get('apiSecret'));

在我的Google脚本中,我正在做山姆

var hash = Utilities.base64Decode(apiSecretB64)

我尝试用相同的秘密和消息调试它,但是得到的结果却不同。

我在邮递员中的实现方式

function computeSignature(request) {
    const data      = request.data;
    const method    = request.method.toUpperCase();
    const path      = getPath(request.url);
    const body      = (method === 'GET' || !data) ? '' : JSON.stringify(data);
    const message   = timestamp + method + path + body;

    const apiSecret = CryptoJS.enc.Base64.parse(pm.variables.get('apiSecret'));
    const hash      = CryptoJS.HmacSHA256(message, apiSecret);

    const hashInBase64 = CryptoJS.enc.Base64.stringify(hash);

    return hashInBase64;
}

我在Google脚本中的实现

function computeSignature(request, path, timestamp) {
    const data      = request.data;
    const method    = request.method;
    const body      = (method === 'GET' || !data) ? '' : JSON.stringify(data);
    const message   = timestamp + method + path + body;

    var apiSecret = Utilities.base64Decode(apiSecretB64);

    var hash = Utilities.computeHmacSha256Signature(message, apiSecret);
    hash = Utilities.base64Encode(hash);

    return hash;
}

有人知道为什么我得到不同的结果吗?

1 个答案:

答案 0 :(得分:0)

我设法通过将消息从字符串转换为字节数组来解决此问题:

function computeSignature(request, path, timestamp) {
    const data      = request.data;
    const method    = request.method;
    const body      = (method === 'GET' || !data) ? '' : JSON.stringify(data);
    const message   = timestamp + method + path + body;

    var apiSecretByteArr = Utilities.base64Decode(apiSecretB64);
    var messageByteArr = Utilities.base64Decode(Utilities.base64Encode(message));

    var hash = Utilities.computeHmacSha256Signature(messageByteArr, apiSecretByteArr);

    return Utilities.base64Encode(hash);
}

可能有更好的方法,但是至少现在正在计算正确的签名。