JWT-auth プラグインは、JSON Web Token (JWT) に基づいてリクエストを認証・認可します。URL パラメーター、リクエストヘッダー、または Cookie から JWT を解析し、トークンを検証してアクセスを許可または拒否します。JWT 認証および認可とは異なり、このプラグインは呼び出し元も識別するため、呼び出し元ごとに異なる JWT 認証情報を設定できます。
設定フィールド
認証設定
|
名前 |
データ型 |
必須 |
デフォルト値 |
説明 |
|
consumers |
array of object |
必須 |
- |
リクエスト認証に使用するサービスコンシューマーです。 |
|
global_auth |
bool |
任意 (インスタンスレベルの設定のみ) |
- |
インスタンスレベルでのみ設定可能です。 |
次の表に、consumers の各項目のフィールドを示します。
|
名前 |
データ型 |
必須 |
デフォルト値 |
説明 |
|
name |
string |
必須 |
- |
コンシューマーの名前です。 |
|
jwks |
string |
|
- |
JSON Web キー (JWK) で指定された、JWT 署名の検証に使用する公開キーまたは対称キーを含む JSON Web キーセット (JWKS) 文字列です。 |
|
remote_jwks |
object |
|
{"uri":"http://127.0.0.1/keys","service":"test.static","port":"80","ttl":30000,"timeout":3000} |
指定されたサービス URI から定期的に JWKS を取得します。 説明
|
|
issuer |
string |
任意 |
- |
JWT の発行者です。ペイロードの |
|
claims |
object |
任意 |
- |
ペイロード内のキーと値のペアに対応するキーと値のペアであり、複数のフィールドがペイロードと一致することを検証するために使用されます。たとえば、 |
|
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 の |
|
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 ペイロードの検証に失敗しました。たとえば、 |
|
403 |
Access Denied |
現在のルートへのアクセス権限がありません。 |