Övning – Skydda webhook-nyttolaster med en hemlighet

Slutförd

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

  1. Gå tillbaka till funktionsappen som du skapade i den första övningen i modulen i Azure-portalen.

  2. I det vänstra menyfönstret går du till Funktioner och väljer Funktioner. Fönstret Funktioner visas för funktionsappen.

  3. Välj den HttpTrigger1 som du skapade. Fönstret HtttpTrigger1 visas för funktionen.

  4. I det vänstra menyfönstret, under Utvecklare, väljer du Kod + Test. Fönstret Kod + test visas för din funktion.

  5. 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');
    
  6. I den översta menyraden väljer du Spara. Fönstret Loggar visas längst ned i fönstret.

  7. I det vänstra menyfönstret under Utvecklare väljer du Funktionsnycklar. Fönstret Funktionsnycklar visas för funktionen.

  8. Under kolumnen Värde väljer du länken Visa värde .

  9. Välj ikonen Kopiera till Urklipp och spara nyckeln för användning i nästa steg.

  10. I det vänstra menyfönstret, under Utvecklare, väljer du Kod + Test. Fönstret Kod + test visas för din funktion.

  11. 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.

  12. Lägg till en annan const som förbereder sha1= i början av nyckeln, så att den matchar formatet x-hub-signature för i begärandehuvudet. Lägg till följande kod i funktionen.

    const shaSignature = `sha1=${signature}`;
    
  13. Lägg till följande kod för att hämta GitHub-signaturen från begärandehuvudet:

    const gitHubSignature = req.headers['x-hub-signature'];
    
  14. 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 {
            ...
        }
    }
    
  15. 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"
            };
        }
    };
    
  16. I den översta menyraden väljer du Spara. Fönstret Loggar visas med en Anslut!-instruktion.

Uppdatera webhook-hemligheten

  1. Växla till ditt GitHub-konto i GitHub-portalen.

  2. Välj din lagringsplats.

  3. I den översta menyraden väljer du Inställningar. Fönstret Inställningar visas.

  4. I sidofältet väljer du Webhooks. Fönstret Webhooks visas.

  5. Välj Redigera bredvid din webhook.

  6. I textrutan Hemlighet anger du standardnyckeln från din funktion som du sparade tidigare i den här övningen.

  7. Rulla ned till slutet av sidan och välj Uppdatera webhook. Fönstret Webhooks/Manage webhooks visas.

Testa webhooken och Azure-funktionen

  1. Välj fliken Senaste leveranser .

  2. Välj den senaste (översta) leveransposten genom att välja knappen ellips (...).

  3. 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.

  4. Välj den senaste (översta) leveransposten genom att välja knappen ellips (...).

  5. 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

  1. I GitHub-portalen går du till sidan webhooks och väljer fliken Inställningar.

  2. I testrutan Hemlighet väljer du Ändra hemlighet.

  3. Ange en slumpmässig sträng, rulla nedåt och välj sedan Uppdatera webhook.

    Den nyckel som används av webhooken bör inte längre matcha som förväntat av Azure-funktionen.

  4. Välj fliken Senaste leveranser .

  5. Välj den senaste (översta) leveransposten genom att välja knappen ellips (...).

  6. Välj Skicka om och välj Ja i dialogrutan Förleverer nyttolast som visas.

  7. Du ser nu att svarskoden är 401, vilket anger att begäran inte godkändes.

  8. Välj den senaste (översta) leveransposten (omleverans) genom att välja dess ellipsknapp (...).

  9. Välj fliken Svar och i avsnittet Brödtext kontrollerar du att meddelandet "Signaturer matchar inte" visas.