tech・1分で読める
GitHub AppsのJWTをローカルで生成する(bash + openssl)
GitHub Appのinstallation tokenを取得するためのJWTを、bash + opensslで最小構成で生成するメモ。
#GitHub#GitHub Apps#JWT#bash#openssl
GitHub AppsのJWTをローカルで生成する(bash + openssl)
GitHub App の installation token を取得するには、まず GitHub App の JWT(RS256) が必要です。
手元でサクッと作る用のメモ。
#!/bin/bash
set -euo pipefail
# GitHub App settings から取得
client_id="" # App ID(もしくは Client ID 相当の値)
installation_id="" # Installation ID
# GitHub App の秘密鍵(PEM)
pem_file="./xxx.pem"
[ -f "${pem_file}" ] || { echo "PEM file not found: ${pem_file}" >&2; exit 1; }
now=$(date +%s)
iat=$((now - 60))
exp=$((now + 600))
b64enc() { openssl base64 | tr -d '=' | tr '/+' '_-' | tr -d '\n'; }
header_json='{"typ":"JWT","alg":"RS256"}'
header=$(printf '%s' "${header_json}" | b64enc)
payload_json="{\"iat\":${iat},\"exp\":${exp},\"iss\":\"${client_id}\"}"
payload=$(printf '%s' "${payload_json}" | b64enc)
header_payload="${header}.${payload}"
signature=$(printf '%s' "${header_payload}" | openssl dgst -sha256 -sign "${pem_file}" | b64enc)
JWT="${header_payload}.${signature}"
printf '%s\n' "JWT: ${JWT}"
# installation token request
curl --request POST \
--url "https://api.github.com/app/installations/${installation_id}/access_tokens" \
--header "Accept: application/vnd.github+json" \
--header "Authorization: Bearer ${JWT}" \
--header "X-GitHub-Api-Version: 2022-11-28"