Проверка HMAC с помощью специального бота Microsoft Teams в ColdFusion - PullRequest
3 голосов
/ 08 марта 2019

Я пытаюсь аутентифицировать собственного бота Microsoft Teams с ColdFusion, , следуя инструкциям Microsoft в C # . Я также попытался следовать этому примеру PHP . Но мне не повезло. Есть идеи, что мне здесь не хватает?

<cfset secretKey       = "MsVx7SpJKnSiycvsUyLMiD8lDIFkEUDhuYuFAT94hXY=">
<cfset httpRequestData = GetHttpRequestData()>
<cfset c               = httpRequestData.content>
<cfset calculated_hmac = toBase64(hmac(c, secretKey, "HMACSHA256"))>

Я получаю это ...

calculated_hmac: NjE2RUY1RjREQTNEMzk1Q0RBNUJDMEE2NDhFNzk3RDIyNUMzRDJDMjk5NTYzMDgxODk0NkU3Njc3RTVEQTAyQQ==

В то время как авторизация headers.author это ...

HMAC 6N0WyOW7g+LqShKYsouWOrPjgh0PD1gazfwNeNwpuS8=

Для этого конкретного примера GetHttpRequestData().content было ...

{ "Тип": "сообщение", "идентификатор": "1552059974228", "метка": "2019-03-08T15: 46: 14.225Z", "localTimestamp": "2019-03-08T09: 46: 14.225-06: 00" , "serviceUrl": "https://smba.trafficmanager.net/amer/","channelId":"msteams","from":{"id":"29:1lY_4faAJwr1qSsIBSpFnI3nYpy3wv5hLp5qZk1_uuc_3ET_aW1Ttu_vN-evUZ0TXVKIBoy8wEBzPT7a1WgwOTQ","name":"Gordon Фробениусова " "aadObjectId": "be3510a6-204d-4b3f-b6c3-52bbddb303d5"}, "разговор": { "isGroup": верно, "идентификатор": "19: a69ef3b3162a43018edb05db74138636@thread.skype; MessageId = 1552059031619"," имя ": нулевой," conversationType ":" канал "}," получатель ": нулевой," TextFormat ":" обычная " "attachmentLayout": нулевой, "membersAdded": [], "membersRemoved": []," topicName ": нулевой," historyDisclosed ": нулевой," локаль ":" EN-US " "текст":" cmpro бот-справка \ n "," speak ": null," inputHint ": null," summary ": null," SuggesActions ": null," attachments ": [{" contentType ":" text / html "," contentUrl ": нуль, "содержание": "http://schema.skype.com/Mention\" Itemid = \ "0 \"> cmpro Справка бота \ n "," name ": null," thumbnailUrl ": null}]," entity ": [{" type ":" clientInfo "," locale ":" en-US "," country ":" US », "платформа": "Windows"}], "channelData": { "teamsChannelId": "19: a69ef3b3162a43018edb05db74138636@thread.skype", "teamsTeamId": "19: a69ef3b3162a43018edb05db74138636@thread.skype", "канал": { "идентификатор": "19: a69ef3b3162a43018edb05db74138636@thread.skype"}, "команда": { "ID": "19: a69ef3b3162a43018edb05db74138636@thread.skype"}, "арендатор": { "ID": "0d78b7c2-75c2-4dad -966d-500250225e13 "}}," действие ": нулевой," replyToId ": нулевой," значение ": NULL," имя ": нулевой," relatesTo ": нулевой," код ": нулевой}

1 Ответ

3 голосов
/ 08 марта 2019

(Обратите внимание, что я не смог воспроизвести этот "selected_hmac", потому что строка образца "content" должна каким-то образом отличаться от оригинала - возможно, просто пробел, но этого достаточно, чтобы полностью изменить результат ...).

В любом случае, основываясь на инструкциях , я бы предположил, что основная проблема заключается в использовании строк, а не двоичных, в хешировании:

  1. Генерация hmac из тела запроса сообщения .... Вам нужно преобразовать тело в байтовый массив в UTF8.
  2. Чтобы вычислить хеш, предоставьте массив байтов токена безопасности , предоставленного Microsoft Teams при регистрации исходящего веб-крюка.

Сначала попробуйте расшифровать тело в двоичный файл

<cfset bodyBinary = charsetDecode(GetHttpRequestData().content, "utf-8")>

Сделайте то же самое с секретным ключом

<cfset secretKey  = "MsVx7SpJKnSiycvsUyLMiD8lDIFkEUDhuYuFAT94hXY=">
<cfset secretBinary = binaryDecode(secretKey, "base64")>

Наконец, не забудьте, что HMAC () возвращает шестнадцатеричную строку. Если вам нужна base64, вам придется сделать DIY:

<cfset hexHash = hmac(bodyBinary, secretBinary, "HMACSHA256")>
<cfset calculated_hmac = binaryEncode(binaryDecode(hexHash, "hex"), "base64")>
...