Övning – Skydda webhook-nyttolaster med en hemlighet
I den här övningen ska du skydda din webhook-nyttolast med en hemlighet och lära dig hur du verifierar att nyttolaster faktiskt kommer från GitHub med hjälp av din Azure-funktion.
Hämta en nyckel för din Azure-funktion
- I Azure Portal går du till funktionsappen som du skapade tidigare. 
- I fönstret Funktionsapp väljer du funktionsappen under Funktioner i mittenfönstret. 
- Välj den HttpTrigger1 som du skapade. Fönstret HtttpTrigger1 visas för funktionen. 
- I det vänstra menyfönstret, under Utvecklare, väljer du Kod + Test. Fönstret Kod + test visas för din funktion. 
- I JavaScript-filen index.js för funktionen lägger du till en referens till biblioteket crypto-js i början av filen, ovanför - module.exports-instruktionen.- const Crypto = require('crypto');
- I den översta menyraden väljer du Spara. Fönstret Loggar visas längst ned i fönstret. 
- I det vänstra menyfönstret under Utvecklare väljer du Funktionsnycklar. Fönstret Funktionsnycklar visas för funktionen. 
- Under kolumnen Värde väljer du länken Visa värde . 
- Välj ikonen Kopiera till Urklipp och spara nyckeln för användning i nästa steg. 
- I det vänstra menyfönstret, under Utvecklare, väljer du Kod + Test. Fönstret Kod + test visas för din funktion. 
- Lägg till följande kod efter -instruktionen i kodblocket - context.log. Ersätt <standardnyckeln> med standardnyckeln som du precis kopierade till Urklipp:- const hmac = Crypto.createHmac("sha1", "<default key>"); const signature = hmac.update(JSON.stringify(req.body)).digest('hex');- Den här koden beräknar nyckelns hash med samma metod som GitHub. 
- Lägg till en annan - constsom förbereder- sha1=i början av nyckeln, så att den matchar formatet- x-hub-signatureför i begärandehuvudet. Lägg till följande kod i funktionen.- const shaSignature = `sha1=${signature}`;
- Lägg till följande kod för att hämta GitHub-signaturen från begärandehuvudet: - const gitHubSignature = req.headers['x-hub-signature'];
- Jämför de två strängarna. Om de matchar bearbetar du din begäran på följande sätt: - if (!shaSignature.localeCompare(gitHubSignature)) { // Existing code if (req.body.pages[0].title) { ... } else { ... } }
- Om strängarna inte matchar returneras ett HTTP 401-svar (obehörig) med ett meddelande till avsändaren om att signaturerna inte matchar. - if (!shaSignature.localeCompare(gitHubSignature)) { ... } else { context.res = { status: 401, body: "Signatures don't match" }; }- Den färdiga funktionen bör se ut så här: - 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" }; } };
- I den översta menyraden väljer du Spara. Fönstret Loggar visas med instruktionen Ansluten! . 
Uppdatera webhook-hemligheten
- Växla till ditt GitHub-konto i GitHub-portalen. 
- Välj din lagringsplats. 
- I den översta menyraden väljer du Inställningar. Fönstret Inställningar visas. 
- I sidofältet väljer du Webhooks. Fönstret Webhooks visas. 
- Välj Redigera bredvid din webhook. 
- I textrutan Hemlighet anger du standardnyckeln från din funktion som du sparade tidigare i den här övningen. 
- Rulla ned till slutet av sidan och välj Uppdatera webhook. Fönstret Webhooks/Manage webhooks visas. 
Testa webhooken och Azure-funktionen
- Välj fliken Senaste leveranser . 
- Välj den senaste (översta) leveransposten genom att välja knappen ellips (...). 
- Välj Skicka igen. I dialogrutan Skicka nyttolast? som visas väljer du Ja, skicka nyttolasten igen. - Den här åtgärden simulerar att du redigerar wiki-sidan igen. 
- Välj den senaste (översta) leveransposten genom att välja knappen ellips (...). 
- I avsnittet Rubriker visas - x-hub-signature. Du ser också att svarskoden är 200, vilket anger att begäran har bearbetats.- 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>
Testa en ogiltig signatur
- I GitHub-portalen går du till sidan webhooks och väljer knappen Redigera för din webhook. 
- I rutan Hemlighet väljer du Ändra hemlighet. 
- Ange en slumpmässig sträng, rulla nedåt och välj Uppdatera webhook. - Den nyckel som används av webhooken bör inte längre matcha som förväntat av Azure-funktionen. 
- Välj fliken Senaste leveranser . 
- Välj den senaste (översta) leveransposten genom att välja knappen ellips (...). 
- Välj Skicka om och välj Ja i dialogrutan Förleverer nyttolast som visas. 
- Du ser nu att svarskoden är 401, vilket anger att begäran inte godkändes. 
- Välj den senaste (översta) leveransposten (omleverans) genom att välja dess ellipsknapp (...). 
- Välj fliken Svar och i avsnittet Brödtext kontrollerar du att meddelandet "Signaturer matchar inte" visas.