Wander Purrgraming

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

はじめに

以前phpで動いている社内アプリケーションにGitHubApp認証を導入したので、実装方法について軽くまとめておきます。

準備

実装方法

GitHub App インストールとしての認証 のガイドに沿って実装していきます。

大まかな流れとしては

  1. 作成したGithubAppのAppIdとprivateKeyからJsonWebトークンを作成
  2. 作成した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
}