我正在嘗試使用需要 HMAC 進行身份驗證的 API。我能夠使用 PHP 生成并使用正確的密鑰(使用供應商的說明),但現在我需要在 Google Apps Script 中執行相同的操作,但我失敗了...
供應商提供的 API 密鑰是C77C96EEF6F6995B,其中包含 8 位元組十六進制的資訊。
下面是我的作業 PHP 腳本:
<?php
$klucz = chr(hexdec('C7')).chr(hexdec('7C')).chr(hexdec('96')).chr(hexdec('EE')).chr(hexdec('F6')).chr(hexdec('F6')).chr(hexdec('99')).chr(hexdec('5B'));
$url = "https://www.ifirma.pl/iapi/abonent/miesiacksiegowy.json";
$nazwaUsera = "[email protected]";
$nazwaKlucza = "abonent";
$hashWiadomosci = hash_hmac("sha1",$url.$nazwaUsera.$nazwaKlucza, $klucz);
echo $hashWiadomosci;
?>
它生成一個哈希值:9b5f9bb41ac30b9c55b10f3cecdd6e12e852f274 ,當我與郵遞員一起使用它時,呼叫 API 作業正常。問題是當我嘗試以類似的方式在 Google 應用程式腳本中復制它時:
function bytesToHex(data) {
return data.map(function(e) {
var v = (e < 0 ? e 256 : e).toString(16);
return v.length == 1 ? "0" v : v;
}).join("");
}
function callNumbers() {
var klucz = String.fromCharCode(parseInt("C7",16)) String.fromCharCode(parseInt("7C",16)) String.fromCharCode(parseInt("96",16)) String.fromCharCode(parseInt("EE",16)) String.fromCharCode(parseInt("F6",16)) String.fromCharCode(parseInt("F6",16)) String.fromCharCode(parseInt("99",16)) String.fromCharCode(parseInt("5B",16));
var user = "[email protected]"
var url = "https://www.ifirma.pl/iapi/abonent/miesiacksiegowy.json";
var wiadomosc = url user "abonent";
var hmac = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_1, wiadomosc, klucz);
hmac=bytesToHex(hmac)
Logger.log(hmac);
}
這將回傳完全不同的計算哈希值:6f50edae11b1f7f5b8488a99c4df3e797662c739
請幫我除錯一下。
順便提一句。代碼中的憑據是虛擬帳戶的有效憑據。
uj5u.com熱心網友回復:
在您的腳本中,如何將 的十六進制值轉換為$klucz = chr(hexdec('C7')).chr(hexdec('7C')).chr(hexdec('96')).chr(hexdec('EE')).chr(hexdec('F6')).chr(hexdec('F6')).chr(hexdec('99')).chr(hexdec('5B'));Google Apps 腳本中的位元組陣列?在 Google Apps Script 中,我認為使用位元組陣列可能比使用二進制資料更合適。
當這反映在你的腳本中時,它變成如下。
修改后的腳本:
在此修改中,修改了功能callNumbers()。
function callNumbers() {
var hex = "C77C96EEF6F6995B";
var klucz = hex.match(/.{2}/g).map(e => parseInt(e[0], 16).toString(2).length == 4 ? parseInt(e, 16) - 256: parseInt(e, 16));
var user = "[email protected]"
var url = "https://www.ifirma.pl/iapi/abonent/miesiacksiegowy.json";
var wiadomosc = url user "abonent";
var hmac = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_1, Utilities.newBlob(wiadomosc).getBytes(), klucz);
hmac=bytesToHex(hmac)
Logger.log(hmac);
}
- 通過將 HEX 值轉換為位元組陣列,
Utilities.computeHmacSignature也需要將的引數轉換為位元組陣列。 - 運行此腳本時,
9b5f9bb41ac30b9c55b10f3cecdd6e12e852f274會獲得。這與您的 PHP 腳本的值相同。 - 當然
var klucz = ['C7', '7C', '96', 'EE', 'F6', 'F6', '99', '5B'].map(e => parseInt(e[0], 16).toString(2).length == 4 ? parseInt(e, 16) - 256 : parseInt(e, 16));也可以用。
參考:
- computeHmacSignature(演算法,值,鍵)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/346523.html
