firebase/php-jwtを使ったGitHubApp認証の実装

はじめに
以前phpで動いている社内アプリケーションにGitHubApp認証を導入したので、実装方法について軽くまとめておきます。
準備
- firebase/php-jwtのインストール
- GithubAppの作成 以下記事に詳しくまとまっているので参照 本記事では詳しくは紹介しません
実装方法
GitHub App インストールとしての認証 のガイドに沿って実装していきます。
大まかな流れとしては
- 作成したGithubAppのAppIdとprivateKeyからJsonWebトークンを作成
- 作成したJsonWebトークンをリクエストヘッダにつけてPostリクエストを送ってインストールアクセストークンを取得する
といった感じになります。
サンプルコード
function getGithubAppInstallationToken() { $private_key = getenv('GITHUBAPP_PRIVATE_KEY'); $app_id = getenv('GITHUBAPP_APP_ID'); $isuued_at = new DateTimeImmutable(); $expire = $issued_at->modify('+10 minutes')->getTimeStamp();
$payload = [ 'iss' => $app_id, 'iat' => $issued_at->getTimeStamp(), 'exp' => $expire ] $token = JWT::encode($payload, $private_key, 'RS256'); $installation_id = getenv('INSTALLATION_ID')
$installation_token = json_decode(postCurl("https://api.github.com/app/installations/${installation_id}/access_tokens", $token), true);}
function postCurl($url, $token) { $ch = curl_init() $header = array( "Authorization: Bearer $token" );
curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch);
return $result}