Невозможно проверить подпись полезной нагрузки обратного вызова Forge - PullRequest
1 голос
/ 19 февраля 2020

В настоящее время я использую API Forge Webhooks для обработки различных событий, которые могут произойти в проекте. Все работает нормально, кроме проверки подписи полезной нагрузки.

Причина, по которой я хочу проверить полезную нагрузку, заключается в том, что обратный вызов будет в конечном итоге на моем API, и я хочу отклонить все запросы, которые не приходят от службы webhook Forge .


Шаги, за которыми я следовал:

  1. Добавить (зарегистрировать) секретный ключ (токен) в Forge. Справочник по API
  2. Инициирует событие, которое в конечном итоге вызовет мой API для его обработки.
  3. Проверка заголовка подписи. Выполнил этот урок .
  4. ПРОБЛЕМА !!! Мой computedSignature отличается от подписи, полученной от Forge.

Мой C# код выглядит следующим образом:

private const string SHA_HASH = "sha1hash";

var secretKeyBytes = Encoding.UTF8.GetBytes(ForgeAuthConfiguration.AntiForgeryToken);

using var hmac = new HMACSHA1(secretKeyBytes);

var computedHash = hmac.ComputeHash(request.Body.ReadAsBytes());

var computedSignature = $"{SHA_HASH}={computedHash.Aggregate("", (s, e) => s + $"{e:x2}", s => s)}";

Например, запрос Forge имеет такой заголовок подписи: sha1hash=303c4e7d2a94ccfa559560dc2421cee8496d2d83

Мой C# код вычисляет эту подпись: sha1hash=3bb8d41c3c1cb6c9652745f5996b4e7f832ca8d5

Тот же AntiForgeryToken был отправлено в Forge на шаге 1

Хорошо, я думал, что мой код C# не работает, затем я попытался этот онлайн-генератор HMA C и для заданного ввода, результат это: 3bb8d41c3c1cb6c9652745f5996b4e7f832ca8d5 (так же, как C#)

Хорошо, возможно, онлайн-генератор сломан, я попробовал собственный код в node js, и вот результат:

enter image description here


У меня есть 3 способа шифрования одного и того же тела с использованием того же ключа, и я получаю тот же самый результат каждый раз. НО эти результаты ОТЛИЧАЮТСЯ от подписи, предоставленной Forge, что приводит к провалу проверки и отклонению действительного запроса ...

Кто-нибудь знает, что происходит с этой подписью?

Почему это отличается от моего результата, если я следую их руководству?

Как вы проверяете свои запросы?

1 Ответ

1 голос
/ 20 февраля 2020

Код ниже работает на моей стороне. Не могли бы вы попробовать, если это поможет?

    [HttpPost]
    [Route("api/forge/callback/webhookbysig")]
    public async Task<IActionResult> WebhookCallbackBySig()
    {
        try
        {
            var encoding = Encoding.UTF8;
            byte[] rawBody = null;
            using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
            {
                rawBody = encoding.GetBytes(reader.ReadToEnd());
            }
            var requestSignature = Request.Headers["x-adsk-signature"];
            string myPrivateToken = Credentials.GetAppSetting("FORGE_WEBHOOK_PRIVATE_TOKEN");
            var tokenBytes = encoding.GetBytes(myPrivateToken);
            var hmacSha1 = new HMACSHA1(tokenBytes);
            byte[] hashmessage = hmacSha1.ComputeHash(rawBody);
            var calculatedSignature = "sha1hash=" + BitConverter.ToString(hashmessage).ToLower().Replace("-", "");
            if (requestSignature.Equals(calculatedSignature))
            {
                System.Diagnostics.Debug.Write("Same!");
            }
            else
            {
                System.Diagnostics.Debug.Write("diff!");
            }

        }
        catch(Exception ex)
        {

        }

        // ALWAYS return ok (200)

        return Ok();        
 }

Если это не помогло, поделитесь, пожалуйста, своим идентификатором webhook (лучше отправьте электронное письмо на forge. help@autodesk.com). Мы попросим команду инженеров проверить это.

...