Я пытаюсь проверить исходящее сообщение веб-хука Microsoft Teams на моей конечной точке отдыха.В заголовке «Авторизация» HTTP Post запроса от Команд есть подпись HMAC, которую я должен проверить, согласно их документации, мне нужно:
- Сгенерировать hmac из тела запроса сообщения.Есть стандартные библиотеки для этого на большинстве платформ.Microsoft Teams использует стандартную криптографию SHA256 HMAC.Вам нужно будет преобразовать тело в байтовый массив в UTF8.
- Чтобы вычислить хэш, предоставьте байтовый массив токена безопасности, предоставленного Microsoft Teams при регистрации исходящего веб-крюка.
- Преобразуйте хеш в строку, используя кодировку UTF8.
- Сравните строковое значение сгенерированного хеша со значением, указанным в HTTP-запросе.
Моя конечная точка REST - ServiceNowи это ограничено, когда дело доходит до нативной функции JS.Я смог успешно импортировать библиотеку jsrsasign и подтвердил ее правильную работу с проверкой JWT ранее.Я посмотрел на их API документацию по MAC и Message Digest, но не совсем понял, что мне нужно сделать.Может ли кто-нибудь помочь мне с примерами того, как использовать эту библиотеку для генерации подписи HMAC, чтобы я мог сравнить с HMAC, который я получил?Я пытался что-то вроде этого, но, похоже, не работает:
var HMAC = request.getHeader('authorization');
var secret = gs.base64Decode('rZ84WrEZ');
var body = JSON.stringify(request.body.data);
var hash = CryptoJS.HmacSHA256(encode(body), encode(secret)));
var base64 = CryptoJS.enc.Base64.stringify(hash);
//Read online that JS string is stored as utf-16, so i use the function below to turn it into utf-8
function encode (string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}