目的
JWTを利用することが増えてきましたが、都度払いだした鍵の管理が業務を圧迫するため
KMS管理のキーペアでJWTを作成する備忘録です。
コード
KMSでは秘密鍵を取得することができないため、直接署名しています。
公開鍵は取得できるため、decodeは既存ライブラリ利用の想定です。
エンタープライズ環境では lcobucci/jwt のSigner実装として組み込むなどをお勧めします。
use Aws\Kms\KmsClient;
class JWTEncoder
{
/**
* JWT生成
*
* @param KMSClient $kms
* @param string $key
* @param array $claims
* @return string
*/
public static function encode(KMSClient $kms, string $key, array $claims): string
{
$segments[] = static::base64url_encode(json_encode(['typ' => 'JWT', 'alg' => 'RS512']));
$segments[] = static::base64url_encode(json_encode($claims));
$result = $kms->sign([
'KeyId' => $key,
'Message' => implode('.', $segments),
'SigningAlgorithm' => 'RSASSA_PKCS1_V1_5_SHA_512',
]);
$segments[] = static::base64url_encode($result['Signature']);
return implode('.', $segments);
}
/**
* base64 url safe encode
*
* @param string $input
* @return string
*/
private static function base64url_encode(string $input): string
{
return rtrim(strtr(base64_encode($input), '+/', '-_'), '=');
}
}
呼び出し。
$jwt = JWTEncoder::encode(new KmsClient([
'version' => 'latest',
'region' => 'ap-northeast-1',
]), 'alias/jwt', [
'key' => 'alias/jwt',
'sub' => 'hogehoge',
]);