Упражнение. Защита полезных данных веб-перехватчика с помощью секрета
В этом упражнении вы защитите полезные данные веб-перехватчика с помощью секрета и узнаете, как проверить, что полезные данные фактически находятся из GitHub с помощью функции Azure.
Получение ключа для функции Azure
На портале Azure перейдите в приложение-функцию, созданное ранее.
На панели "Приложение-функция" выберите приложение-функцию в разделе "Функции " в центральной области.
Выберите созданный httpTrigger1 . Панель HtttpTrigger1 откроется для вашей функции.
В области меню слева в разделе "Разработчик" выберите "Код и тест". Область "Код и тест " отображается для функции.
В index.js файле JavaScript функции добавьте ссылку на библиотеку crypto-js в начале файла выше инструкции
module.exports
.const Crypto = require('crypto');
В верхней строке меню нажмите кнопку "Сохранить". Область журналов отображается в нижней части области.
В области меню слева в разделе "Разработчик" выберите "Ключи функций". Откроется область "Ключи функций " для функции.
В столбце "Значение" выберите ссылку "Показать значение ".
Выберите значок копирования в буфер обмена и сохраните этот ключ для использования на следующем шаге.
В области меню слева в разделе "Разработчик" выберите "Код и тест". Область "Код и тест " отображается для функции.
Добавьте следующий код в блок кода после инструкции
context.log
. Замените <ключ по умолчанию ключом> по умолчанию, скопированным в буфер обмена:const hmac = Crypto.createHmac("sha1", "<default key>"); const signature = hmac.update(JSON.stringify(req.body)).digest('hex');
Этот код вычисляет хэш ключа с помощью того же механизма, что и GitHub.
Добавьте еще
const
передsha1=
в начало ключа, чтобы он соответствовал форматуx-hub-signature
в заголовке запроса. Добавьте в функцию следующий код.const shaSignature = `sha1=${signature}`;
Добавьте следующий код для получения подписи GitHub из заголовка запроса:
const gitHubSignature = req.headers['x-hub-signature'];
Сравните эти две строки. Если они совпадают, обработайте запрос следующим образом:
if (!shaSignature.localeCompare(gitHubSignature)) { // Existing code if (req.body.pages[0].title) { ... } else { ... } }
Если строки не совпадают, возвратите ответ HTTP 401 (не санкционировано) в сообщении отправителю о том, что подписи не совпадают.
if (!shaSignature.localeCompare(gitHubSignature)) { ... } else { context.res = { status: 401, body: "Signatures don't match" }; }
Готовая функция будет выглядеть так:
const Crypto = require('crypto'); module.exports = async function (context, req) { context.log('JavaScript HTTP trigger function processed a request.'); const hmac = Crypto.createHmac("sha1", "<default key>"); const signature = hmac.update(JSON.stringify(req.body)).digest('hex'); const shaSignature = `sha1=${signature}`; const gitHubSignature = req.headers['x-hub-signature']; if (!shaSignature.localeCompare(gitHubSignature)) { if (req.body.pages[0].title) { context.res = { body: "Page is " + req.body.pages[0].title + ", Action is " + req.body.pages[0].action + ", Event Type is " + req.headers['x-github-event'] }; } else { context.res = { status: 400, body: ("Invalid payload for Wiki event") } } } else { context.res = { status: 401, body: "Signatures don't match" }; } };
В верхней строке меню нажмите кнопку "Сохранить". Область журналов отображается с сообщением Подключено!
Обновление секрета веб-перехватчика
Перейдите к учетной записи GitHub на портале GitHub.
Выберите репозиторий.
В верхней строке меню выберите "Параметры". Откроется область параметров .
На боковой панели выберите вебхуки. Откроется область Вебхуков.
Нажмите Изменить рядом с вашим webhook.
В текстовом поле "Секрет" введите ключ по умолчанию из функции, которую вы ранее сохранили в этом упражнении.
Прокрутите вниз до нижней части страницы и выберите Обновить вебхук. Откроется панель Webhooks/Manage webhooks.
Тестирование веб-перехватчика и функции Azure
Перейдите на вкладку "Последние поставки ".
Выберите последнюю (верхнюю) запись доставки, нажав кнопку с многоточием (...).
Выберите Redeliver. В появившемся диалоговом окне "Повторно отправить полезную нагрузку?" выберите "Да, повторно отправить эту полезную нагрузку".
Это действие имитирует редактирование вики-страницы еще раз.
Выберите последнюю (верхнюю) запись доставки, нажав кнопку с многоточием (...).
В разделе "Заголовки" вы увидите
x-hub-signature
. Вы также увидите, что код ответа — 200, что указывает на то, что запрос обработан успешно.Request URL: https://testwh123456.azurewebsites.net/api/HttpTrigger1?code=aUjXIpqdJ0ZHPQuB0SzFegxGJu0nAXmsQBnmkCpJ6RYxleRaoxJ8cQ%3D%3D Request method: POST content-type: application/json Expect: User-Agent: GitHub-Hookshot/16496cb X-GitHub-Delivery: ce122460-6aae-11e9-99d4-de6a298a424a X-GitHub-Event: gollum X-Hub-Signature: sha1=<hash of default key>
Тестирование недопустимой подписи
На портале GitHub на странице вебхуков нажмите кнопку "Изменить" для вашего вебхука.
В поле "Секрет" выберите "Изменить секрет".
Введите случайную строку, прокрутите вниз и выберите «Обновить вебхук».
Ключ, используемый веб-перехватчиком, больше не должен совпадать с ключом, ожидаемым функцией Azure.
Перейдите на вкладку "Последние поставки ".
Выберите последнюю (верхнюю) запись доставки, нажав кнопку с многоточием (...).
Выберите Redeliver, и в появившемся диалоговом окне Redeliver полезной нагрузки выберите Да, повторно доставить эту полезную нагрузку.
На этот раз вы увидите, что код ответа — 401. Это указывает на то, что запрос не авторизован.
Выберите последнюю (верхнюю) запись доставки (redelivery), нажав кнопку с многоточием (...).
Перейдите на вкладку "Ответ " и в разделе "Текст " убедитесь, что появится сообщение "Подписи не совпадают".