От моего поставщика api у меня есть код, который предназначен для создания ключа hmac.
<html>
<head>
</head>
<body>
<p id = "demo"></p>
<script>var BuckarooHmac = (function () {
var self = {};
function getEncodedContent(content) {
if (content) {
var md5 = CryptoJS.MD5(content);
var base64 = CryptoJS.enc.Base64.stringify(md5);
return base64;
}
return content;
}
function getHash(websiteKey, secretKey, httpMethod, nonce, timeStamp, requestUri, content) {
var encodedContent = getEncodedContent(content);
var rawData = websiteKey + httpMethod + requestUri + timeStamp + nonce + encodedContent;
var hash = CryptoJS.HmacSHA256(rawData, secretKey);
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
return hashInBase64;
}
function getTimeStamp() {
return Math.floor((new Date).getTime() / 1000);
}
function getNonce() {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 16; i++) {
text += possible.charAt(Math.floor(Math.random() * possible.length));
}
return text;
}
self.GetAuthHeader = function (requestUri, websiteKey, secretKey, content, httpMethod) {
var nonce = getNonce();
var timeStamp = getTimeStamp();
content = content ? content : "";
var url = encodeURIComponent(requestUri).toLowerCase();
return "hmac " + websiteKey + ":" + getHash(websiteKey, secretKey, httpMethod, nonce, timeStamp, url, content) + ":" + nonce + ":" + timeStamp;
}
return self;
document.getElementById("demo").innerHTML = self.GetAuthHeader();
}());
</script>
</body>
</html>
Я не привык к javascript. Я пытаюсь понять, как распечатать сгенерированный ключ на моем экране. Я пробовал это:
document.getElementById("demo").innerHTML = self.GetAuthHeader();
Я знаю, что, должно быть, делаю это неправильно. Мне просто нужен толчок в правильном направлении. Кто-нибудь, кто мог бы мне помочь?
Где вы пробуете эту строчку кода? Если он находится за пределами этой закрытой области видимости функции, значит, переменная self отсутствует, но есть BuckarooHmac.GetAuthHeader().
@BenjaminGruenbaum Я не набирал этот код. Он уже создан. Я просто пытаюсь показать результаты.
@David есть собственная переменная. И я пробую эту строку кода прямо под return self;
@Kevin: Вместо того, чтобы просто описывать то, что вы пробовали, продемонстрируйте это в коде вопроса.
@ Дэвид, я добавил то, что пытался, в основной код



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы пытаетесь выполнить действие после в инструкции return функции. Этот код никогда не будет достигнут, потому что функция вернулась.
Вместо этого сделайте это раньше:
document.getElementById("demo").innerHTML = self.GetAuthHeader();
return self;
Или, что еще лучше, если этот код предоставляется поставщиком, вам, вероятно, не следует его редактировать. Обновления удалят ваши правки, и поддержка поставщика будет скомпрометирована. Вместо этого полностью выполняйте свое действие вне кода:
var BuckarooHmac = (function () {
// vendor code
}());
document.getElementById("demo").innerHTML = BuckarooHmac.GetAuthHeader();
Есть ли причина, по которой вы не используете встроенный
crypto.subtleв браузерах? Это довольно просто, чтобы получить hmac, если вы уже знаете базовые концепции.