🍎

コマンドラインでHS256のJWTを作成してみる

2021/04/27に公開

はじめに

単純にトークンを生成したいという場合は https://jwt.io/ を使ったり、ライブラリの使用をおすすめします

この記事では、コマンドを1行1行実行していくことで、あーJWT(HS256)ってこういう感じで作ってるのねってのを実感するくらいのことができます

コマンドラインでHS256のJWTを生成

Headerをbase64エンコードする

Header
{
  "alg": "HS256",
  "typ": "JWT"
}

base64の実装注意点より、base64コマンド結果から=を取り除いたり/+-にリプレイスする必要がある点に注意してください(今回の記事では都度必要な処理をいれてます)

user@host: ~/workspace $ echo -n '{"alg":"HS256","typ":"JWT"}' | base64
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

user@host: ~/workspace $ export HEADER="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"

Payloadをbase64エンコードする

Payload
{
  "exp": 1618911178,
  "iat": 1618910878,
  "sub": "d395e2d3-1d4c-4e58-8a18-5a19fd0e4627",
  "typ": "Bearer"
}

※ Payloadの構成情報としては参考にしないでください

user@host: ~/workspace $ echo -n '{"exp":1618911178,"iat":1618910878,"sub":"d395e2d3-1d4c-4e58-8a18-5a19fd0e4627","typ":"Bearer"}' | base64 | sed 's/=$//'
eyJleHAiOjE2MTg5MTExNzgsImlhdCI6MTYxODkxMDg3OCwic3ViIjoiZDM5NWUyZDMtMWQ0Yy00ZTU4LThhMTgtNWExOWZkMGU0NjI3IiwidHlwIjoiQmVhcmVyIn0

user@host: ~/workspace $ export PAYLOAD="eyJleHAiOjE2MTg5MTExNzgsImlhdCI6MTYxODkxMDg3OCwic3ViIjoiZDM5NWUyZDMtMWQ0Yy00ZTU4LThhMTgtNWExOWZkMGU0NjI3IiwidHlwIjoiQmVhcmVyIn0"

Signatureを生成する

user@host: ~/workspace $ export MESSAGE="$HEADER.$PAYLOAD"
user@host: ~/workspace $ export SECRET_KEY="secret"
user@host: ~/workspace $ echo -n $MESSAGE \
    | openssl dgst -hmac $SECRET_KEY -sha256 -binary \
    | base64 | sed -e 's/=$//' -e 's/+/-/'
8x-GyBqq7dQ1DPyBnZEpoztGjJZHJRlAH8h1NsObNIY

user@host: ~/workspace $export SIGNATURE="8x-GyBqq7dQ1DPyBnZEpoztGjJZHJRlAH8h1NsObNIY"

JWTを作成

user@host: ~/workspace $ export JWT="$HEADER.$PAYLOAD.$SIGNATURE"
user@host: ~/workspace $ echo $JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTg5MTExNzgsImlhdCI6MTYxODkxMDg3OCwic3ViIjoiZDM5NWUyZDMtMWQ0Yy00ZTU4LThhMTgtNWExOWZkMGU0NjI3IiwidHlwIjoiQmVhcmVyIn0.8x+GyBqq7dQ1DPyBnZEpoztGjJZHJRlAH8h1NsObNIY

https://jwt.io/ などを使って↑の結果が問題ないか見てみると良いです

Discussion