アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

AWS LambdaでGitHubWebhookを検証してpayloadを取り出す

import { createRequire } from 'module';
const require = createRequire(import.meta.url);

import crypto from 'crypto'
const querystring = require('node:querystring');

export const handler = async (event) => {
  console.log(JSON.stringify(event, null, 2));
  const body = event["body"];

  if(!isValidSignature(body, event.headers["X-Hub-Signature-256"])) {
    console.log("is not valid")
    return {
      statusCode: 200,
      body: "is not valid",
    };
  }
  
  const parsedQuery = querystring.parse(body);
  const payload = JSON.parse(parsedQuery.payload)
  console.log(payload);

  const response = {
    statusCode: 200,
    body: "ok",
  };
  
  return response;
};

function isValidSignature(body, signature) {
  const hmac = crypto.createHmac('sha256', process.env.WEBHOOK_SECRET)
  hmac.update(body, 'utf8')
  const checkSignature = `sha256=${hmac.digest('hex')}`
  console.log(`${checkSignature} === ${signature}`)
  return checkSignature === signature
}