Oefening: Webhookpayloads beveiligen met een geheim
In deze oefening beveiligt u uw webhookpayload met een geheim en leert u hoe u kunt valideren dat nettoladingen daadwerkelijk afkomstig zijn van GitHub met behulp van uw Azure-functie.
Een sleutel voor uw Azure-functie ophalen
Ga in Azure Portal terug naar de functie-app die u in de eerste oefening in de module hebt gemaakt.
Selecteer Functies in het linkermenuvenster onder Functions. Het deelvenster Functions wordt weergegeven voor uw functie-app.
Selecteer de HttpTrigger1 die u hebt gemaakt. Het deelvenster HtttpTrigger1 wordt weergegeven voor uw functie.
Selecteer code + test in het linkermenuvenster onder Ontwikkelaars. Het deelvenster Code en test wordt weergegeven voor uw functie.
Voeg in het JavaScript-bestand index.js van uw functie een verwijzing toe naar de crypto-js-bibliotheek aan het begin van het bestand, boven de
module.exports
-instructie.const Crypto = require('crypto');
Selecteer Opslaan in de bovenste menubalk. Het deelvenster Logboeken wordt onder aan het deelvenster weergegeven.
Selecteer functiesleutels in het linkermenuvenster onder Ontwikkelaars. Het deelvenster Functietoetsen wordt weergegeven voor uw functie.
Selecteer onder de kolom Waarde de koppeling Waarde weergeven.
Selecteer het pictogram Kopiƫren naar klembord en sla deze sleutel op voor gebruik in de volgende stap.
Selecteer code + test in het linkermenuvenster onder Ontwikkelaars. Het deelvenster Code en test wordt weergegeven voor uw functie.
Voeg in het codeblok, na de
context.log
instructie, de volgende code toe. Vervang <de standaardsleutel door de standaardsleutel> die u zojuist naar het Klembord hebt gekopieerd:const hmac = Crypto.createHmac("sha1", "<default key>"); const signature = hmac.update(JSON.stringify(req.body)).digest('hex');
Deze code berekent de hash van de sleutel, met behulp van hetzelfde mechanisme als GitHub.
Voeg nog een
const
sleutel toe die voorafsha1=
gaat aan het begin van de sleutel, zodat deze overeenkomt met de indeling inx-hub-signature
de aanvraagheader. Voeg de volgende code toe aan uw functie.const shaSignature = `sha1=${signature}`;
Voeg de volgende code toe om de GitHub-handtekening op te halen uit de aanvraagheader:
const gitHubSignature = req.headers['x-hub-signature'];
Vergelijk de twee tekenreeksen. Als ze overeenkomen, verwerkt u de aanvraag als volgt:
if (!shaSignature.localeCompare(gitHubSignature)) { // Existing code if (req.body.pages[0].title) { ... } else { ... } }
Als de tekenreeksen niet overeenkomen, retourneert u een HTTP 401-antwoord (ongeautoriseerd) met een bericht dat de afzender aangeeft dat de handtekeningen niet overeenkomen.
if (!shaSignature.localeCompare(gitHubSignature)) { ... } else { context.res = { status: 401, body: "Signatures don't match" }; }
De voltooide functie ziet er als volgt uit:
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" }; } };
Selecteer Opslaan in de bovenste menubalk. Het deelvenster Logboeken wordt weergegeven met de instructie Verbonden! .
Het webhookgeheim bijwerken
Schakel over naar uw GitHub-account in de GitHub-portal.
Selecteer uw opslagplaats.
Selecteer Instellingen in de bovenste menubalk. Het deelvenster Instellingen wordt weergegeven.
Selecteer Webhooks in de zijbalk. Het deelvenster Webhooks wordt weergegeven.
Selecteer Bewerken naast uw webhook.
Voer in het tekstvak Geheim de standaardsleutel in van uw functie die u eerder in deze oefening hebt opgeslagen.
Schuif omlaag naar de onderkant van de pagina en selecteer Webhook bijwerken. Het deelvenster Webhooks/Webhooks beheren wordt weergegeven.
De webhook en de Azure-functie testen
Selecteer het tabblad Recente leveringen .
Selecteer de meest recente (bovenste) leveringsvermelding door de knop met het beletselteken (...) te selecteren.
Selecteer Opnieuw verzenden. Selecteer in het dialoogvenster Redeliver payload dat wordt weergegeven Ja, deze nettolading opnieuw verzenden.
Met deze actie wordt gesimuleerd dat u de Wiki-pagina opnieuw bewerkt.
Selecteer de meest recente (bovenste) leveringsvermelding door de knop met het beletselteken (...) te selecteren.
In de sectie Kopteksten ziet u het
x-hub-signature
. U ziet ook dat de responscode 200 is, wat aangeeft dat de aanvraag met succes is verwerkt.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>
Een ongeldige handtekening testen
Selecteer in de GitHub-portal op de pagina Webhooks het tabblad Instellingen .
Selecteer Geheim wijzigen in het testvak Geheim.
Voer een willekeurige reeks in, schuif omlaag en selecteer vervolgens Webhook bijwerken.
De door de webhook gebruikte sleutel mag niet langer overeenkomen met de door de Azure-functie verwachte sleutel.
Selecteer het tabblad Recente leveringen .
Selecteer de meest recente (bovenste) leveringsvermelding door de knop met het beletselteken (...) te selecteren.
Selecteer Redeliver en selecteer in het dialoogvenster Nettolading van Redeliver dat wordt weergegeven Ja, deze nettolading opnieuw verzenden.
Deze keer ziet u dat de responscode 401 is, wat aangeeft dat de aanvraag niet is geautoriseerd.
Selecteer de meest recente (bovenste) leveringsvermelding (redelivery) door de knop met het beletselteken (...) te selecteren.
Selecteer het tabblad Antwoord en controleer in de sectie Hoofdtekst of het bericht 'Handtekeningen komen niet overeen' wordt weergegeven.