LoginSignup
4
1

More than 1 year has passed since last update.

KMSで生成したキーペアを利用してJWTを作成するサンプル

Last updated at Posted at 2021-12-16

目的

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',
]);
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1