すべてのプロダクト
Search
ドキュメントセンター

API Gateway:JWT-auth プラグイン

最終更新日:Sep 10, 2026

JWT-auth プラグインは、JSON Web Token (JWT) に基づいてリクエストを認証・認可します。URL パラメーター、リクエストヘッダー、または Cookie から JWT を解析し、トークンを検証してアクセスを許可または拒否します。JWT 認証および認可とは異なり、このプラグインは呼び出し元も識別するため、呼び出し元ごとに異なる JWT 認証情報を設定できます。

設定フィールド

認証設定

名前

データ型

必須

デフォルト値

説明

consumers

array of object

必須

-

リクエスト認証に使用するサービスコンシューマーです。

global_auth

bool

任意 (インスタンスレベルの設定のみ)

-

インスタンスレベルでのみ設定可能です。true に設定すると、認証はグローバルに適用されます。false に設定すると、認証は設定されたドメイン名とルートにのみ適用されます。設定されていない場合、下位互換性を維持するため、ドメイン名またはルートの設定が存在しない場合にのみ、認証がグローバルに適用されます。

次の表に、consumers の各項目のフィールドを示します。

名前

データ型

必須

デフォルト値

説明

name

string

必須

-

コンシューマーの名前です。

jwks

string

jwks または remote_jwks のいずれかが必要です。

-

JSON Web キー (JWK) で指定された、JWT 署名の検証に使用する公開キーまたは対称キーを含む JSON Web キーセット (JWKS) 文字列です。

remote_jwks

object

jwks または remote_jwks のいずれかが必要です。

{"uri":"http://127.0.0.1/keys","service":"test.static","port":"80","ttl":30000,"timeout":3000}

指定されたサービス URI から定期的に JWKS を取得します。 jwks と remote_jwks の両方が設定されている場合、リモートから取得した JWKS が優先されます。

説明

remote_jwks によって返される JWKS のサイズは 1 MB 未満である必要があります。サイズがこの制限を超えてエラーが発生した場合は、DingTalk グループ 88010006189 に参加するか、チケットを起票してサポートを依頼してください。

issuer

string

任意

-

JWT の発行者です。ペイロードの iss フィールドと一致する必要があります。

claims

object

任意

-

ペイロード内のキーと値のペアに対応するキーと値のペアであり、複数のフィールドがペイロードと一致することを検証するために使用されます。たとえば、aud: mobile-site と設定した場合、ペイロードの aud フィールドは mobile-site である必要があります。

claims_to_headers

array of object

任意

-

JWT ペイロードから指定されたフィールドを抽出し、リクエストヘッダーとして設定してからバックエンドに転送します。

from_headers

array of object

任意

[{"name":"Authorization","value_prefix":"Bearer"}]

指定されたリクエストヘッダーから JWT を抽出します。

from_params

array of string

任意

access_token

指定された URL パラメーターから JWT を抽出します。

from_cookies

array of string

任意

-

指定された Cookie から JWT を抽出します。

clock_skew_seconds

number

任意

60

JWT の exp および iat フィールドを検証する際に許容されるクロックスキュー (秒単位) です。

keep_token

bool

任意

true

リクエストをバックエンドに転送する際に JWT を保持するかどうかを指定します。

説明

デフォルト値は、from_headers、from_params、from_cookies が設定されていない場合にのみ使用されます。

  • 次の表に、from_headers の各項目のフィールドを示します。

    名前

    データ型

    必須

    デフォルト値

    説明

    name

    string

    必須

    -

    JWT が抽出されるリクエストヘッダーです。

    value_prefix

    string

    必須

    -

    ヘッダー値から削除するプレフィックスです。残りの部分が JWT として扱われます。

  • 次の表に、claims_to_headers の各項目のフィールドを示します。

    名前

    データ型

    必須

    デフォルト値

    説明

    claim

    string

    必須

    -

    JWT ペイロード内の指定されたフィールドです。値は文字列または符号なし整数である必要があります。

    header

    string

    必須

    -

    抽出されたクレーム値を設定し、バックエンドに転送するためのリクエストヘッダーです。

    override

    bool

    任意

    true

    • true の場合、同じ名前のリクエストヘッダーが存在すれば、それをオーバーライドします。

    • false の場合、値を重複するリクエストヘッダーとして追加します。

  • 次の表に、remote_jwks の各項目のフィールドを示します。

    名前

    データ型

    必須

    デフォルト値

    説明

    uri

    string

    必須

    -

    リクエスト URL です。

    service

    string

    必須

    -

    • Kubernetes サービスの例:foo.default.svc.cluster.local

    • Nacos サービスの例:foo.DEFAULT-GROUP.public.nacos

    • test という名前の DNS サービスの場合、test.dns と入力します。

    • test という名前の静的 IP サービスの場合、test.static と入力します。

    port

    number

    必須

    -

    サービスポートです。

    timeout

    number

    任意

    3000

    サービスリクエストのタイムアウト (ミリ秒単位) です。

    ttl

    number

    任意

    30000

    キャッシュ期間 (ミリ秒単位) です。

認可設定 (任意)

名前

データ型

必須

デフォルト値

説明

allow

array of string

任意 (インスタンスレベルの設定では使用不可)

-

ルートやドメイン名などのきめ細かいルールでのみ設定可能です。一致したリソースへのアクセスを許可するコンシューマーを指定します。

重要
  • 認可設定と認証設定は、同じルール内で併用できません。

  • 認証と認可を通過したリクエストには、呼び出し元の名前を識別するための X-Mse-Consumer ヘッダーが追加されます。

設定例

グローバル認証とルートレベルの認可の設定

この例では、インスタンスレベルでグローバル JWT 認証を有効にし、特定のコンシューマーに対してルートレベルのアクセスを制限します。

説明

JWT が複数の JWKS に一致する場合、設定の順序で最初に一致したコンシューマーが使用されます。

プラグイン設定

インスタンスレベルでプラグインを次のように設定します:

consumers:
- name: consumer1
  issuer: abcd
  jwks: |
    {
      "keys": [
        {
          "kty": "oct",
          "kid": "123",
          "k": "hM0k3AbXBPpKOGg__Ql2Obcq7s60myWDpbHXzgKUQdYo7YCRp0gUqkCnbGSvZ2rGEl4YFkKqIqW7mTHdj-bcqXpNr-NOznEyMpVPOIlqG_NWVC3dydBgcsIZIdD-MR2AQceEaxriPA_VmiUCwfwL2Bhs6_i7eolXoY11EapLQtutz0BV6ZxQQ4dYUmct--7PLNb4BWJyQeWu0QfbIthnvhYllyl2dgeLTEJT58wzFz5HeNMNz8ohY5K0XaKAe5cepryqoXLhA-V-O1OjSG8lCNdKS09OY6O0fkyweKEtuDfien5tHHSsHXoAxYEHPFcSRL4bFPLZ0orTt1_4zpyfew",
          "alg": "HS256"
        }
      ]
    }
- name: consumer2
  issuer: abc
  jwks: |
    {
      "keys": [
        {
          "kty": "RSA",
          "e": "AQAB",
          "use": "sig",
          "kid": "123",
          "alg": "RS256",
          "n": "i0B67f1jggT9QJlZ_8QL9QQ56LfurrqDhpuu8BxtVcfxrYmaXaCtqTn7OfCuca7cGHdrJIjq99rz890NmYFZuvhaZ-LMt2iyiSb9LZJAeJmHf7ecguXS_-4x3hvbsrgUDi9tlg7xxbqGYcrco3anmalAFxsbswtu2PAXLtTnUo6aYwZsWA6ksq4FL3-anPNL5oZUgIp3HGyhhLTLdlQcC83jzxbguOim-0OEz-N4fniTYRivK7MlibHKrJfO3xa_6whBS07HW4Ydc37ZN3Rx9Ov3ZyV0idFblU519nUdqp_inXj1eEpynlxH60Ys_aTU2POGZh_25KXGdF_ZC_MSRw"
        }
      ]
    }

ルートとドメイン名の設定

route-a と route-b のルートについては、プラグインを次のように設定します:

allow:
- consumer1

*.example.com と test.com のドメイン名については、プラグインを次のように設定します:

allow:
- consumer2
説明
  • この例では、route-a と route-b はゲートウェイルートの作成時に入力したルート名です。リクエストがこれらのルートに一致する場合、consumer1 という名前の呼び出し元にアクセスが許可されます。他の呼び出し元はアクセスを拒否されます。

  • この例では、*.example.com と test.com はリクエストのドメイン名と照合するために使用されます。ドメイン名が一致する場合、consumer2 という名前の呼び出し元にアクセスが許可されます。他の呼び出し元はアクセスを拒否されます。

リクエスト例

この設定では、次のリクエストが許可されます。これらの例では、リクエストが route-a ルートに一致することを前提としています。

  • JWT を URL パラメーターに設定します。

    curl  'http://xxx.hello.com/test?access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEy****.eyJpc3MiOiJhYmNkIiwic3ViIjoidGVzdCIsImlhdCI6MTY2NTY2MDUyNywiZXhwIjoxODY1NjczODE5fQ.-vBSV0bKeDwQcuS6eeSZN9dLTUnSnZVk8eVCXdooCQ4'
  • JWT を HTTP リクエストヘッダーに設定します。

    curl  http://xxx.hello.com/test -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJpc3MiOiJhYmNkIiwic3ViIjoidGVzdCIsImlhdCI6MTY2NTY2MDUyNywiZXhwIjoxODY1NjczODE5fQ.-vBSV0bKeDwQcuS6eeSZN9dLTUnSnZVk8eVCXdooCQ4'

結果の検証

認証が成功すると、呼び出し元の名前が設定された X-Mse-Consumer ヘッダーがリクエストに追加されます。この例では、その値は consumer1 です。

次のリクエストは拒否されます。

  • リクエストに JWT が含まれていないため、401 エラーが返されます。

  • 指定された JWT に一致する呼び出し元にアクセス権限がないため、403 エラーが返されます。

ゲートウェイインスタンスレベルでの有効化と特定ルートでの無効化

インスタンスレベルでプラグインを次のように設定します:

global_auth: true
consumers:
- name: consumer1
  issuer: abcd
  jwks: |
    {
      "keys": [
        {
          "kty": "oct",
          "kid": "123",
          "k": "hM0k3AbXBPpKOGg__Ql2Obcq7s60myWDpbHXzgKUQdYo7YCRp0gUqkCnbGSvZ2rGEl4YFkKqIqW7mTHdj-bcqXpNr-NOznEyMpVPOIlqG_NWVC3dydBgcsIZIdD-MR2AQceEaxriPA_VmiUCwfwL2Bhs6_i7eolXoY11EapLQtutz0BV6ZxQQ4dYUmct--7PLNb4BWJyQeWu0QfbIthnvhYllyl2dgeLTEJT58wzFz5HeNMNz8ohY5K0XaKAe5cepryqoXLhA-V-O1OjSG8lCNdKS09OY6O0fkyweKEtuDfien5tHHSsHXoAxYEHPFcSRL4bFPLZ0orTt1_4zpyfew",
          "alg": "HS256"
        }
      ]
    }
- name: consumer2
  issuer: abc
  jwks: |
    {
      "keys": [
        {
          "kty": "RSA",
          "e": "AQAB",
          "use": "sig",
          "kid": "123",
          "alg": "RS256",
          "n": "i0B67f1jggT9QJlZ_8QL9QQ56LfurrqDhpuu8BxtVcfxrYmaXaCtqTn7OfCuca7cGHdrJIjq99rz890NmYFZuvhaZ-LMt2iyiSb9LZJAeJmHf7ecguXS_-4x3hvbsrgUDi9tlg7xxbqGYcrco3anmalAFxsbswtu2PAXLtTnUo6aYwZsWA6ksq4FL3-anPNL5oZUgIp3HGyhhLTLdlQcC83jzxbguOim-0OEz-N4fniTYRivK7MlibHKrJfO3xa_6whBS07HW4Ydc37ZN3Rx9Ov3ZyV0idFblU519nUdqp_inXj1eEpynlxH60Ys_aTU2POGZh_25KXGdF_ZC_MSRw"
        }
      ]
    }

route-b ルートについては、プラグインを次のように設定します:

_disable_: true

この例では、route-b はゲートウェイルートの作成時に入力されたルート名です。_disable_ が true に設定されているため、リクエストがこのルートに一致すると、プラグインは無効になります。JWT 認証は実行されず、すべてのユーザーにアクセスが許可されます。

route-b ルートに一致しないリクエストについては、インスタンスレベルで global_auth が true に設定されているため、JWT 認証が実行されます。consumer1 と consumer2 の両方にアクセスが許可されます。

ドメイン名レベルでの有効化と特定ルートでの無効化

インスタンスレベルでプラグインを次のように設定します:

consumers:
- name: consumer1
  issuer: abcd
  jwks: |
    {
      "keys": [
        {
          "kty": "oct",
          "kid": "123",
          "k": "hM0k3AbXBPpKOGg__Ql2Obcq7s60myWDpbHXzgKUQdYo7YCRp0gUqkCnbGSvZ2rGEl4YFkKqIqW7mTHdj-bcqXpNr-NOznEyMpVPOIlqG_NWVC3dydBgcsIZIdD-MR2AQceEaxriPA_VmiUCwfwL2Bhs6_i7eolXoY11EapLQtutz0BV6ZxQQ4dYUmct--7PLNb4BWJyQeWu0QfbIthnvhYllyl2dgeLTEJT58wzFz5HeNMNz8ohY5K0XaKAe5cepryqoXLhA-V-O1OjSG8lCNdKS09OY6O0fkyweKEtuDfien5tHHSsHXoAxYEHPFcSRL4bFPLZ0orTt1_4zpyfew",
          "alg": "HS256"
        }
      ]
    }
- name: consumer2
  issuer: abc
  jwks: |
    {
      "keys": [
        {
          "kty": "RSA",
          "e": "AQAB",
          "use": "sig",
          "kid": "123",
          "alg": "RS256",
          "n": "i0B67f1jggT9QJlZ_8QL9QQ56LfurrqDhpuu8BxtVcfxrYmaXaCtqTn7OfCuca7cGHdrJIjq99rz890NmYFZuvhaZ-LMt2iyiSb9LZJAeJmHf7ecguXS_-4x3hvbsrgUDi9tlg7xxbqGYcrco3anmalAFxsbswtu2PAXLtTnUo6aYwZsWA6ksq4FL3-anPNL5oZUgIp3HGyhhLTLdlQcC83jzxbguOim-0OEz-N4fniTYRivK7MlibHKrJfO3xa_6whBS07HW4Ydc37ZN3Rx9Ov3ZyV0idFblU519nUdqp_inXj1eEpynlxH60Ys_aTU2POGZh_25KXGdF_ZC_MSRw"
        }
      ]
    }

route-b ルートについては、プラグインを次のように設定します:

_disable_: true

*.example.com ドメイン名については、プラグインを次のように設定します:

allow:
- consumer1
- consumer2

この例では、route-b はゲートウェイルートの作成時に入力されたルート名です。_disable_ が true に設定されているため、リクエストがこのルートに一致すると、プラグインは無効になります。JWT 認証は実行されず、すべてのユーザーにアクセスが許可されます。

この例では、*.example.com はリクエストのドメイン名と照合するために使用されます。ドメイン名が一致する場合、consumer1 または consumer2 という名前の呼び出し元にアクセスが許可されます。他の呼び出し元はアクセスを拒否されます。

ルールは順次照合され、最初に一致したものが適用されると、それ以降のルールは評価されません。ルートのルールはドメイン名のルールよりも優先されるため、あるドメイン名に対してプラグインを有効にし、そのドメイン配下の特定のルートでは無効にするといった設定が可能です。

関連エラーコード

HTTP ステータスコード

エラーメッセージ

原因

401

Jwt missing

リクエストヘッダーに JWT が含まれていません。

401

Jwt expired

JWT の有効期限が切れています。

401

Jwt verification fails

JWT ペイロードの検証に失敗しました。たとえば、 iss が一致しません。

403

Access Denied

現在のルートへのアクセス権限がありません。