jwt-encode について
jwt-encodeは、テストや開発用のJWTを作成・署名するスキルです。クレーム、アルゴリズム、鍵、有効期限の設定を案内し、トークンとデコード済みのヘッダーおよびペイロードを表示します。
主な機能
- 01JWTの作成と署名
- 02クレームとアルゴリズムの設定
- 03iatとexpの自動追加
- 04デコード済みヘッダーとペイロードの表示
- 05鍵の安全な取り扱い規則
活用シーン
- 01開発テスト用トークンの作成
- 02独自クレームと有効期限の確認
- 03非対称署名用テスト鍵の生成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jsonwebtoken/ jwt-skills --skill jwt-encodeインストール後、Claude Code で/jwt-encodeを入力して読み込まれたか確認します。
詳細
JWT エンコード
テストや開発用の JWT を作成して署名します。
手順
- 入力を収集します:クレーム/ペイロード、アルゴリズム(デフォルト:HS256)、シークレットまたは鍵、有効期限(デフォルト:1 時間)。
- ヘッダーを構築します:
{"alg": "HS256", "typ": "JWT"}。指定されている場合はkidを追加します。 - ペイロードを構築します:ユーザーが省略を指定しない限り、必ず
iatとexpを含めます。ユーザーが指定したクレームを追加します。 - トークンに署名します。最適な利用可能な方法を使用します(以下を参照)。
- 結果を表示します:JWT 文字列全体と、ヘッダー+ペイロードをデコードした内訳。
署名方法
利用可能な最初の方法を選びます。ユーザーのクレーム、シークレット、アルゴリズムを使用します。以下の例はテンプレートにすぎません。シェル履歴に残らないよう、シークレットは必ずインライン環境変数として渡してください。
Node.js(推奨):
まず、jose が利用可能であることを確認します。見つからない場合はグローバルにインストールします。
node --input-type=module -e "await import('jose')" 2>/dev/null || npm install -g jose
次にトークンに署名します。
JWT_SECRET='user-provided-secret' node --input-type=module -e "import {SignJWT} from 'jose'; console.log(await new SignJWT({sub:'1234567890'}).setProtectedHeader({alg:'HS256'}).setIssuedAt().setExpirationTime('1h').sign(new TextEncoder().encode(process.env.JWT_SECRET)))"
Python:
JWT_SECRET='user-provided-secret' python3 -c "import jwt,time; print(jwt.encode({'sub':'1234567890','iat':int(time.time()),'exp':int(time.time())+3600}, __import__('os').environ['JWT_SECRET'], algorithm='HS256'))"
Bash(HMAC-SHA256 のみ):
header=$(printf '{"alg":"HS256","typ":"JWT"}' | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
payload=$(printf '{"sub":"1234567890","iat":1700000000,"exp":1700003600}' | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
signature=$(printf '%s.%s' "$header" "$payload" | openssl dgst -sha256 -hmac "$JWT_SECRET" -binary | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
printf '%s.%s.%s\n' "$header" "$payload" "$signature"
テスト用鍵の生成
ユーザーが非対称鍵を必要とする場合に限ります。
# RSA
openssl genrsa -out private.pem 2048 && openssl rsa -in private.pem -pubout -out public.pem
# ECDSA P-256
openssl ecparam -genkey -name prime256v1 -noout -out private-ec.pem && openssl ec -in private-ec.pem -pubout -out public-ec.pem
セキュリティルール
- シークレットをコマンドライン引数にリテラルで渡さないでください。 環境変数(
$JWT_SECRET)またはファイル入力(--secret-file)を使用してください。コマンド引数はシェル履歴やpsの出力から見える場合があります。 - ユーザーの同意なしにパッケージをインストールしないでください。
npx -yを使用したり、pip installを黙って実行したりしないでください。 - ユーザーがシークレットを指定しない場合、
openssl rand -base64 32でランダムなシークレットを生成し、テスト専用のシークレットであることを明示してください。 alg: none— ユーザーが要求した場合は、CVE-2015-9235 を悪用可能な未署名トークンが作成されることを警告してください。明示的な確認を得てから作成してください。- 生成した鍵ファイル — テストが終わったら削除するようユーザーに伝えてください。バージョン管理対象のディレクトリに鍵を書き込まないでください。
コメント
Markdown 対応