我正在尝试从Google脚本向Coinbase Pro进行身份验证。我已经在Postman中使用CryptoJS做到了这一点,但是遇到了问题generating the CB-ACCESS-SIGN signature header。我已经使用测试密钥和秘密字符串进行了测试,以找出Google提供的实现CryptoJS.HmacSHA256和Utilities.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;
}
有人知道为什么我得到不同的结果吗?
答案 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);
}
可能有更好的方法,但是至少现在正在计算正确的签名。