Cvičení – zabezpečení datových částí webhooku tajným kódem
V tomto cvičení ochráníte datovou část webhooku tajným kódem a naučíte se ověřit, že datové části jsou skutečně z GitHubu pomocí funkce Azure Functions.
Získání klíče pro funkci Azure Functions
Na webu Azure Portal se vraťte do aplikace funkcí, kterou jste vytvořili v prvním cvičení v modulu.
V levém podokně nabídek v části Funkce vyberte Funkce. Zobrazí se podokno Funkce pro vaši aplikaci funkcí.
Vyberte httpTrigger1, který jste vytvořili. Pro vaši funkci se zobrazí podokno HtttpTrigger1.
V levém podokně nabídek v části Vývojář vyberte Kód + Test. Pro vaši funkci se zobrazí podokno Kód + test.
Do javascriptového souboru index.js své funkce přidejte na začátek souboru nad výraz
module.exports
odkaz na knihovnu crypto-js.const Crypto = require('crypto');
V horním řádku nabídek vyberte Uložit. V dolní části podokna se zobrazí podokno Protokoly .
V levém podokně nabídek v části Vývojář vyberte Funkční klíče. Zobrazí se podokno Klíče funkcí pro vaši funkci.
Ve sloupci Hodnota vyberte odkaz Zobrazit hodnotu .
Vyberte ikonu Kopírovat do schránky a uložte tento klíč pro použití v dalším kroku.
V levém podokně nabídek v části Vývojář vyberte Kód + Test. Pro vaši funkci se zobrazí podokno Kód + test.
Do bloku kódu za
context.log
příkaz přidejte následující kód. Nahraďte <výchozí klíč> výchozím klíčem, který jste právě zkopírovali do schránky:const hmac = Crypto.createHmac("sha1", "<default key>"); const signature = hmac.update(JSON.stringify(req.body)).digest('hex');
Tento kód vypočítá hodnotu hash klíče pomocí stejného mechanismu jako GitHub.
Přidejte další
const
, která se předzálohujesha1=
na začátek klíče, aby odpovídala formátux-hub-signature
v hlavičce požadavku. Přidejte do funkce následující kód.const shaSignature = `sha1=${signature}`;
Přidejte následující kód, který načte podpis GitHubu z hlavičky požadavku:
const gitHubSignature = req.headers['x-hub-signature'];
Oba řetězce porovnejte. Pokud se shodují, požadavek zpracujte následujícím způsobem:
if (!shaSignature.localeCompare(gitHubSignature)) { // Existing code if (req.body.pages[0].title) { ... } else { ... } }
Pokud se řetězce neshodují, vraťte odpověď HTTP 401 (Neautorizováno) se zprávou pro odesílatele, že se podpisy neshodují.
if (!shaSignature.localeCompare(gitHubSignature)) { ... } else { context.res = { status: 401, body: "Signatures don't match" }; }
Hotová funkce by měla vypadat takto:
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" }; } };
V horním řádku nabídek vyberte Uložit. Zobrazí se podokno Protokoly s příkazem Connected! .
Aktualizace tajného kódu webhooku
Přejděte do účtu GitHub na portálu GitHub.
Vyberte úložiště.
V horním řádku nabídek vyberte Nastavení. Zobrazí se podokno Nastavení .
Na bočním panelu vyberte Webhooky. Zobrazí se podokno Webhooky .
Vedle vašeho webhooku klikněte na Edit (Upravit).
Do textového pole Tajný kód zadejte výchozí klíč z funkce, kterou jste dříve uložili v tomto cvičení.
Posuňte se dolů do dolní části stránky a vyberte Aktualizovat webhook. Zobrazí se podokno Webhooky /Spravovat webhooky .
Test webhooku a funkce Azure
Vyberte kartu Poslední dodávky.
Výběrem tlačítka se třemi tečkou (...) vyberte nejnovější (horní) položku doručení.
Vyberte Redeliver (Doručit znovu). V dialogovém okně Redeliver payload? (Datová část Redeliver), které se zobrazí, vyberte Ano, znovu spusťte tuto datovou část.
Tato akce simuluje opětovnou úpravu stránky wikiwebu.
Výběrem tlačítka se třemi tečkou (...) vyberte nejnovější (horní) položku doručení.
V části Záhlaví se zobrazí
x-hub-signature
. Uvidíte také, že kód odpovědi je 200, což znamená, že požadavek se úspěšně zpracoval.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>
Test neplatného podpisu
Na portálu GitHub na stránce webhooky vyberte kartu Nastavení .
V poli Test tajných kódů vyberte Změnit tajný klíč.
Zadejte náhodný řetězec, přejděte dolů a vyberte Update webhook (Aktualizovat webhook).
Klíč používaný webhookem už by se neměl shodovat s klíčem, který očekává funkce Azure.
Vyberte kartu Poslední dodávky.
Výběrem tlačítka se třemi tečkou (...) vyberte nejnovější (horní) položku doručení.
Vyberte Redeliver a v dialogovém okně Datová část Redeliver, které se zobrazí, vyberte Ano, znovu spusťte tuto datovou část.
Tentokrát uvidíte, že kód odpovědi je 401, což znamená, že požadavek není autorizovaný.
Výběrem tlačítka se třemi tečkou (...) vyberte nejnovější (horní) položku doručení (znovu).
Vyberte kartu Odpověď a v části Text ověřte, že se zobrazí zpráva Podpisy se neshodují.