Github.com av webbkrok
Med hjälp av Webhooks kan du skapa eller konfigurera integreringar som prenumererar på vissa händelser på GitHub.com. När en av dessa händelser utlöses skickar GitHub en HTTP POST-nyttolast till webchens konfigurerade URL. Av säkerhetsskäl är det dock viktigt att verifiera att inkommande webkrok-begäran faktiskt kommer från GitHub och inte från en skadlig aktör. Den här självstudiekursen vägleder dig genom stegen för att verifiera en GitHub.com webkrok-förfrågan i en Adobe App Builder-åtgärd med hjälp av en delad hemlighet.
Konfigurera Github-hemlighet i AppBuilder
-
Lägg till hemlighet i
.env
-filen:I App Builder-projektets
.env
-fil lägger du till en anpassad nyckel för GitHub.com-webbkrokhemligheten:code language-env # Specify your secrets here # This file must not be committed to source control ... GITHUB_SECRET=my-github-webhook-secret-1234!
-
Uppdatera
ext.config.yaml
-fil:Filen
ext.config.yaml
måste uppdateras för att GitHub.com ska kunna verifieras.- Ställ in konfigurationen
web
för AppBuilder-åtgärden påraw
för att ta emot texten för Raw-begäran från GitHub.com. - Lägg till nyckeln
GITHUB_SECRET
underinputs
i åtgärdskonfigurationen för AppBuilder och mappa den till fältet.env
som innehåller hemligheten. Värdet för den här nyckeln är fältnamnet.env
som har prefixet$
. - Ange
require-adobe-auth
-anteckningen i AppBuilder-åtgärdskonfigurationen tillfalse
för att tillåta att åtgärden anropas utan att Adobe-autentisering krävs.
Den resulterande
ext.config.yaml
-filen ska se ut ungefär så här:code language-yaml operations: view: - type: web impl: index.html actions: actions web: web-src runtimeManifest: packages: dx-excshell-1: license: Apache-2.0 actions: github-to-jira: function: actions/generic/index.js web: 'raw' runtime: nodejs:20 inputs: LOG_LEVEL: debug GITHUB_SECRET: $GITHUB_SECRET annotations: require-adobe-auth: false final: true
- Ställ in konfigurationen
Lägg till verifieringskod i AppBuilder-åtgärden
Lägg sedan till den JavaScript-kod som anges nedan (kopieras från GitHub.coms dokumentation) till din AppBuilder-åtgärd. Se till att exportera funktionen verifySignature
.
// src/dx-excshell-1/actions/generic/github-webhook-verification.js
let encoder = new TextEncoder();
async function verifySignature(secret, header, payload) {
let parts = header.split("=");
let sigHex = parts[1];
let algorithm = { name: "HMAC", hash: { name: 'SHA-256' } };
let keyBytes = encoder.encode(secret);
let extractable = false;
let key = await crypto.subtle.importKey(
"raw",
keyBytes,
algorithm,
extractable,
[ "sign", "verify" ],
);
let sigBytes = hexToBytes(sigHex);
let dataBytes = encoder.encode(payload);
let equal = await crypto.subtle.verify(
algorithm.name,
key,
sigBytes,
dataBytes,
);
return equal;
}
function hexToBytes(hex) {
let len = hex.length / 2;
let bytes = new Uint8Array(len);
let index = 0;
for (let i = 0; i < hex.length; i += 2) {
let c = hex.slice(i, i + 2);
let b = parseInt(c, 16);
bytes[index] = b;
index += 1;
}
return bytes;
}
module.exports = { verifySignature };
Implementera verifiering i AppBuilder-åtgärd
Verifiera sedan att begäran kommer från GitHub genom att jämföra signaturen i begärandehuvudet med signaturen som genereras av funktionen verifySignature
.
Lägg till följande kod i funktionen main
i AppBuilder-åtgärdens index.js
:
// src/dx-excshell-1/actions/generic/index.js
const { verifySignature } = require("./github-webhook-verification");
...
// Main function that will be executed by Adobe I/O Runtime
async function main(params) {
// Create a Logger
const logger = Core.Logger("main", { level: params?.LOG_LEVEL || "info" });
try {
// Log parameters if LOG_LEVEL is 'debug'
logger.debug(stringParameters(params));
// Define required parameters and headers
const requiredParams = [
// Verifies the GITHUB_SECRET is present in the action's configuration; add other parameters here as needed.
"GITHUB_SECRET"
];
const requiredHeaders = [
// Require the x-hub-signature-256 header, which GitHub.com populates with a sha256 hash of the payload
"x-hub-signature-256"
];
// Check for missing required parameters and headers
const errorMessage = checkMissingRequestInputs(params, requiredParams, requiredHeaders);
if (errorMessage) {
// Return and log client errors
return errorResponse(400, errorMessage, logger);
}
// Decode the request body (which is base64 encoded) to a string
const body = Buffer.from(params.__ow_body, 'base64').toString('utf-8');
// Verify the GitHub webhook signature
const isSignatureValid = await verifySignature(
params.GITHUB_SECRET,
params.__ow_headers["x-hub-signature-256"],
body
);
if (!isSignatureValid) {
// GitHub signature verification failed
return errorResponse(401, "Unauthorized", logger);
} else {
logger.debug("Signature verified");
}
// Parse the request body as JSON so its data is useful in the action
const githubParams = JSON.parse(body) || {};
// Optionally, merge the GitHub webhook request parameters with the action parameters
const mergedParams = {
...params,
...githubParams
};
// Do work based on the GitHub webhook request
doWork(mergedParams);
return {
statusCode: 200,
body: { message: "GitHub webhook received and processed!" }
};
} catch (error) {
// Log any server errors
logger.error(error);
// Return with 500 status code
return errorResponse(500, "Server error", logger);
}
}
Konfigurera webkrok i GitHub
Gå tillbaka till GitHub.com och ange samma hemliga värde för GitHub.com när du skapar webkroken. Använd det hemliga värde som anges i .env
-filens GITHUB_SECRET
-nyckel.
Gå till databasinställningarna i GitHub.com och redigera webkroken. Ange det hemliga värdet i fältet Secret
i webkrokinställningarna. Klicka på Uppdatera webkrok längst ned om du vill spara ändringarna.
Följ de här stegen för att se till att din App Builder-åtgärd på ett säkert sätt kan verifiera att inkommande webkrok-begäranden verkligen kommer från din GitHub.com.