mcpField
J
jwt-encode

jwt-encode

github.com/jsonwebtokenセキュリティ20617 回インストール29 週間前に更新
リポジトリ

jwt-encode について

jwt-encodeは、テストや開発用のJWTを作成・署名するスキルです。クレーム、アルゴリズム、鍵、有効期限の設定を案内し、トークンとデコード済みのヘッダーおよびペイロードを表示します。

主な機能

  1. 01JWTの作成と署名
  2. 02クレームとアルゴリズムの設定
  3. 03iatとexpの自動追加
  4. 04デコード済みヘッダーとペイロードの表示
  5. 05鍵の安全な取り扱い規則

活用シーン

  1. 01開発テスト用トークンの作成
  2. 02独自クレームと有効期限の確認
  3. 03非対称署名用テスト鍵の生成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jsonwebtoken/jwt-skills --skill jwt-encode

インストール後、Claude Code で/jwt-encodeを入力して読み込まれたか確認します。

詳細

JWT エンコード

テストや開発用の JWT を作成して署名します。

手順

  1. 入力を収集します:クレーム/ペイロード、アルゴリズム(デフォルト:HS256)、シークレットまたは鍵、有効期限(デフォルト:1 時間)。
  2. ヘッダーを構築します:{"alg": "HS256", "typ": "JWT"}。指定されている場合は kid を追加します。
  3. ペイロードを構築します:ユーザーが省略を指定しない限り、必ず iat と exp を含めます。ユーザーが指定したクレームを追加します。
  4. トークンに署名します。最適な利用可能な方法を使用します(以下を参照)。
  5. 結果を表示します: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 を悪用可能な未署名トークンが作成されることを警告してください。明示的な確認を得てから作成してください。
  • 生成した鍵ファイル — テストが終わったら削除するようユーザーに伝えてください。バージョン管理対象のディレクトリに鍵を書き込まないでください。

コメント