RFC 7519準拠のJSON Webトークン (JWT) は、API Gatewayがリクエストを認証するために使用する便利な方法です。 API Gateway
は、ユーザーのパブリックJSON Webキー (JWK)
をホストし、これらのJWKを使用してリクエストのJWTに署名して認証します。 次に、API Gatewayは要求
パラメーターをバックエンドパラメーターとしてバックエンドサービスに転送します。 これにより、バックエンドアプリケーションの開発が簡素化されます。 このトピックでは、JWT認証プラグインを設定する方法について説明します。 JWTと認証プロセスの詳細については、「JWTベースの認証」をご参照ください。
JWT認証プラグイン
は、OpenID Connect
と同じ機能を提供し、次の利点をもたらします。
追加の
権限付与API操作
を設定する必要はありません。JWT
は、複数の方法で生成および分散することができる。 API Gatewayは、パブリックJWK
を使用したJWT
認証のみを担当します。kid
指定のないJWK
がサポートされます。複数の
JWK
を設定できます。リクエストの
header
またはquery
パラメーターからトークン情報を読み取ることができます。トークンは、JWT認証プラグインを使用して、リクエスト内のCookieヘッダーから読み取ることもできます。
Authorization bearer {token}
などのAuthorizationヘッダーでJWT
を送信する場合は、parameter
をAuthorizationに設定し、parameterLocation
をheaderに設定して、トークン情報を正しく読み取ることができます。prevent_JtiReplay
をtrueに設定すると、jti
クレームベースのアンチリプレイチェックがサポートされます。bypassEmptyToken
をtrueに設定すると、トークンを含まないリクエストを検証なしでバックエンドサービスに転送できます。ignoreExpirationCheck
をtrueに設定すると、トークンのexp
設定の検証をスキップできます。
JWT認証プラグイン
を設定し、OpenID Connect
機能が設定されているAPI
にバインドすると、JWT認証プラグインがOpenID Connect
機能の代わりに有効になります。
1. JWKを取得する
RFC 7517準拠のJWKは、JWTの署名と認証に使用されます。 を設定する場合は、JWT认证プラグイン、有効なJWK
手動またはオンラインを使用してJWKの発電機
そのようなs mkjwk.org。 次の例は、有効なJWK
を示しています。 JWKの例では、秘密鍵を使用してトークンに署名し、公開鍵をJWT認証プラグインで設定して署名を認証します。
{
"kty": "RSA",
"e": "AQAB",
"kid": "O9fpdhrViq2zaaaBEWZITz",
"use": "sig",
"alg": "RS256",
"n": "qSVxcknOm0uCq5vGsOmaorPDzHUubBmZZ4UXj-9do7w9X1uKFXAnqfto4TepSNuYU2bA_-tzSLAGBsR-BqvT6w9SjxakeiyQpVmexxnDw5WZwpWenUAcYrfSPEoNU-0hAQwFYgqZwJQMN8ptxkd0170PFauwACOx4Hfr-9FPGy8NCoIO4MfLXzJ3mJ7xqgIZp3NIOGXz-GIAbCf13ii7kSStpYqN3L_zzpvXUAos1FJ9IPXRV84tIZpFVh2lmRh0h8ImK-vI42dwlD_hOIzayL1Xno2R0T-d5AwTSdnep7g-Fwu8-sj4cCRWq3bd61Zs2QOJ8iustH0vSRMYdP5oYQ"
}
上記のJWKはJSON形式です。 JWT認証プラグインをYAML形式で設定する場合は、JWKをYAML形式で使用する必要があります。*
JWT認証プラグイン
の場合、公開鍵
を設定するだけで済みます。秘密鍵
を安全に保管してください。 次の表に、JWT認証プラグインでサポートされている署名アルゴリズムを示します。
署名アルゴリズム | サポートされている |
SHA-2とRSASSA-PKCS1-V1_5 | RS256、RS384、RS512 |
SHA-2付き楕円曲線 (ECDSA) | ES256、ES384、ES512 |
SHA-2を使用したHMAC | HS256、HS384、HS512 |
HS256、HS384、またはHS512タイプのキーを設定すると、キー値はbase64urlエンコードされます。 署名が無効な場合は、キーがトークンの生成に使用されたキーと同じ形式であるかどうかを確認します。
2. プラグインの設定
JWT認証プラグインはJSON形式またはYAML形式で構成できます。これらの2つの形式は同じスキーマであるためです。 yaml to json
ツールを使用して、プラグインの構成形式を変換できます。 次の例は、YAML形式のプラグイン構成テンプレートを示しています。
---
parameter: X-Token # The parameter from which the JWT is read. It corresponds to an API parameter.
parameterLocation: header # The location from which the JWT is read. Valid values: query and header. This parameter is optional if Request Mode for the bound API is set to Map (Filter Out Unknown Parameters) or Map (Pass-through Unknown Parameters). This parameter is required if Request Mode for the bound API is set to Pass-through.
preventJtiReplay: false # Controls whether to enable the anti-replay check for jti. Default value: false.
bypassEmptyToken: false # Controls whether to forward requests that do not include tokens to backend services without verification.
ignoreExpirationCheck: false # Controls whether to ignore the verification of the exp setting.
orAppAuth: false # The default value is false. Both the Alibaba Cloud App authentication and JWT authentication are required. If the value is true, the other authentication method is not required if one authentication is passed.
claimParameters: # The conversion of claims to parameters. API Gateway maps JWT claims to backend parameters.
- claimName: aud # The name of the JWT claim, which can be public or private.
parameterName: X-Aud # The name of the backend parameter, to which the JWT claim is mapped.
location: header # The location of the backend parameter, to which the JWT claim is mapped. Valid values: query, header, path, and formData.
- claimName: userId # The name of the JWT claim, which can be public or private.
parameterName: userId # The name of the backend parameter, to which the JWT claim is mapped.
location: query # The location of the backend parameter, to which the JWT claim is mapped. Valid values: query, header, path, and formData.
#
# Public key in the JWK
jwk:
kty: RSA
e: AQAB
use: sig
alg: RS256
n: qSVxcknOm0uCq5vGsOmaorPDzHUubBmZZ4UXj-9do7w9X1uKFXAnqfto4TepSNuYU2bA_-tzSLAGBsR-BqvT6w9SjxakeiyQpVmexxnDw5WZwpWenUAcYrfSPEoNU-0hAQwFYgqZwJQMN8ptxkd0170PFauwACOx4Hfr-9FPGy8NCoIO4MfLXzJ3mJ7xqgIZp3NIOGXz-GIAbCf13ii7kSStpYqN3L_zzpvXUAos1FJ9IPXRV84tIZpFVh2lmRh0h8ImK-vI42dwlD_hOIzayL1Xno2R0T-d5AwTSdnep7g-Fwu8-sj4cCRWq3bd61Zs2QOJ8iustH0vSRMYdP5oYQ
#
# You can configure multiple JWKs and use them together with the jwk field.
# If multiple JWKs are configured, kid is required. If the JWT does not include kid, the consistency check on kid fails.
jwks:
- kid: O9fpdhrViq2zaaaBEWZITz # If only one JWK is configured, kid is optional. If the JWT includes kid, API Gateway checks the consistency of kid.
kty: RSA
e: AQAB
use: sig
alg: RS256
n: qSVxcknOm0uCq5v....
- kid: 10fpdhrViq2zaaaBEWZITz # If only one JWK is configured, kid is optional. If the JWT includes kid, API Gateway checks the consistency of kid.
kty: RSA
e: AQAB
use: sig
alg: RS256
n: qSVxcknOm0uCq5v...
JWT認証プラグイン
は、parameter
とparameterLocation
の設定に基づいてJWTを取得します。 たとえば、parameter
がX-Tokenに設定され、parameterLocation
がheaderに設定されている場合、JWTはX-Token
ヘッダーから読み取られます。APIで設定されたパラメーターが
parameter
で指定されたパラメーターと同じ名前の場合は、parameterLocation
を指定しないでください。 それ以外の場合、APIが呼び出されるとエラーが報告されます。Authorization bearer {token}
などのAuthorizationヘッダーでトークンを送信する場合は、parameter
をAuthorizationに設定し、parameterLocation
をヘッダーに設定して、トークン情報を正しく読み取ることができます。preventJtiReplay
がtrueに設定されている場合、JWT認証プラグインはクレーム
内のjti
を使用してアンチリプレイチェックを実行します。bypassEmptyToken
がtrueに設定され、トークンがリクエストに含まれていない場合、API Gatewayはチェックをスキップし、リクエストをバックエンドサービスに直接転送します。ignoreExpirationCheck
がtrueに設定されている場合、API Gatewayはexp
設定の検証をスキップします。 それ以外の場合、API Gatewayはトークンの有効期限を確認します。トークン内の
クレーム
をバックエンドサービスに転送するためにAPI Gatewayが必要な場合は、tokenParameters
を設定して、次のパラメーターを転送するように設定できます。claimName
: トークン内のクレームの名前。 HS256、HS384、またはHS512タイプのキーを設定すると、キー値はbase64urlエンコードされます。 署名が無効な場合は、キーがトークンの生成に使用されたキーと同じ形式であるかどうかを確認します。kid
設定がサポートされています。parameterName
: バックエンドサービスに転送されるパラメーターの名前。location
: バックエンドサービスに転送されるパラメーターの場所。 有効な値:header
、query
、path
、formData
。このパラメーターが
path
に設定されている場合、バックエンドパスには/path/{userId}
などの同じ名前のパラメーターが含まれている必要があります。このパラメーターが
formData
に設定されている場合、バックエンドサービスで受信したリクエストの本文はForm
タイプである必要があります。
jwk
フィールドで設定できるキーは1つだけです。jwks
フィールドで複数のキーを設定することもできます。kid
を指定せずに1つのキーのみを設定できます。kid
を指定して複数のキーを設定できます。子供
はユニークでなければなりません。
3. 検証ルール
JWT認証プラグインは、
parameter
とparameterToken
の設定に基づいてトークンを取得します。 トークンがリクエストに含まれていない場合でも、API Gatewayがバックエンドサービスにリクエストを転送する必要がある場合は、bypassEmptyToken
をtrueに設定します。複数のキーを設定する場合は、次の原則に従います。
署名と認証のために、トークンの
kid
の値と同じIDを持つキーを優先的に選択します。kid
を指定しない場合、設定できるキーは1つだけです。 トークンのkid
の値と同じIDのキーが存在しない場合は、署名と認証に指定されたkid
を持たないキーを使用します。構成されたすべてのキーに
kid
設定が指定されていて、リクエスト内のトークンにkid
が含まれていないか、kid
に一致するキーがない場合、A403JK
エラーが報告されます。
トークンに
iat
、nbf
、およびexp
が含まれている場合、JWT認証プラグインは時間形式の有効性を検証します。 時間の単位は秒です。デフォルトでは、API Gatewayは
exp
の設定を検証します。 検証をスキップする場合は、ignoreExpirationCheck
をtrueに設定します。tokenParameters
は、トークンのクレーム
から必要なパラメーターを抽出するように設定されています。 これらのパラメーターはバックエンドサービスに転送されます。
4. 設定例
4.1. 単一のJWKの設定
---
parameter: X-Token # The parameter from which the JWT is read. It corresponds to a parameter in an API request.
parameterLocation: header # The location from which the JWT is read. Valid values: query and header. This parameter is optional if Request Mode for the bound API is set to Map (Filter Out Unknown Parameters) or Map (Pass-through Unknown Parameters). This parameter is required if Request Mode for the bound API is set to Pass-through.
claimParameters: # The claims to be converted into parameters. API Gateway maps JWT claims to backend parameters.
- claimName: aud # The name of the JWT claim, which can be public or private.
parameterName: X-Aud # The name of the backend parameter, to which the JWT claim is mapped.
location: header # The location of the backend parameter, to which the JWT claim is mapped. Valid values: query, header, path, and formData.
- claimName: userId # The name of the JWT claim, which can be public or private.
parameterName: userId # The name of the backend parameter, to which the JWT claim is mapped.
location: query # The location of the backend parameter, to which the JWT claim is mapped. Valid values: query, header, path, and formData.
preventJtiReplay: false # Controls whether to enable the anti-replay check for jti. Default value: false.
#
# Public key in the JWK
jwk:
kty: RSA
e: AQAB
use: sig
alg: RS256
n: qSVxcknOm0uCq5vGsOmaorPDzHUubBmZZ4UXj-9do7w9X1uKFXAnqfto4TepSNuYU2bA_-tzSLAGBsR-BqvT6w9SjxakeiyQpVmexxnDw5WZwpWenUAcYrfSPEoNU-0hAQwFYgqZwJQMN8ptxkd0170PFauwACOx4Hfr-9FPGy8NCoIO4MfLXzJ3mJ7xqgIZp3NIOGXz-GIAbCf13ii7kSStpYqN3L_zzpvXUAos1FJ9IPXRV84tIZpFVh2lmRh0h8ImK-vI42dwlD_hOIzayL1Xno2R0T-d5AwTSdnep7g-Fwu8-sj4cCRWq3bd61Zs2QOJ8iustH0vSRMYdP5oYQ
4.2。 複数のJWKの設定
---
parameter: Authorization # The parameter from which the token is obtained.
parameterLocation: header # The location from which the token is obtained.
claimParameters: # The claims to be converted into parameters. API Gateway maps JWT claims to backend parameters.
- claimName: aud # The name of the JWT claim, which can be public or private.
parameterName: X-Aud # The name of the backend parameter, to which the JWT claim is mapped.
location: header # The location of the backend parameter, to which the JWT claim is mapped. Valid values: query, header, path, and formData.
- claimName: userId # The name of the JWT claim, which can be public or private.
parameterName: userId # The name of the backend parameter, to which the JWT claim is mapped.
location: query # The location of the backend parameter, to which the JWT claim is mapped. Valid values: query, header, path, and formData.
preventJtiReplay: true # Controls whether to enable the anti-replay check for jti. Default value: false.
jwks:
- kid: O9fpdhrViq2zaaaBEWZITz # kid must be set to different values for different JWKs.
kty: RSA
e: AQAB
use: sig
alg: RS256
n: qSVxcknOm0uCq5v....
- kid: 10fpdhrViq2zaaaBEWZITz # kid must be set to different values for different JWKs.
kty: RSA
e: AQAB
use: sig
alg: RS256
n: qSVxcknOm0uCq5v...
4.3. リクエストのcookieのフィールドからトークンを読み取ります。
---
parameter: cookie # The parameter from which the JWT is read. It corresponds to a parameter in an API request.
parameterLocation: header # The location from which the JWT is read. Valid values: query and header. This parameter is optional if Request Mode for the bound API is set to Map (Filter Out Unknown Parameters) or Map (Pass-through Unknown Parameters). This parameter is required if Request Mode for the bound API is set to Pass-through.
parameterSection: token # For example, the value of the cookie parameter is username=tom ; token=abcsef.
claimParameters: # The claims to be converted into parameters. API Gateway maps JWT claims to backend parameters.
- claimName: aud # The name of the JWT claim, which can be public or private.
parameterName: X-Aud # The name of the backend parameter, to which the JWT claim is mapped.
location: header # The location of the backend parameter, to which the JWT claim is mapped. Valid values: query, header, path, and formData.
- claimName: userId # The name of the JWT claim, which can be public or private.
parameterName: userId # The name of the backend parameter, to which the JWT claim is mapped.
location: query # The location of the backend parameter, to which the JWT claim is mapped. Valid values: query, header, path, and formData.
preventJtiReplay: true # Controls whether to enable the anti-replay check for jti. Default value: false.
jwks:
- kid: O9fpdhrViq2zaaaBEWZITz # kid must be set to different values for different JWKs.
kty: RSA
e: AQAB
use: sig
alg: RS256
n: qSVxcknOm0uCq5v....
- kid: 10fpdhrViq2zaaaBEWZITz # kid must be set to different values for different JWKs.
kty: RSA
e: AQAB
use: sig
alg: RS256
n: qSVxcknOm0uCq5v...
一部のwebシナリオでは、セキュリティを確保するために、Cookieパラメーターの指定されたフィールドにトークンを保存することができます。 API GatewayのJWTプラグインを使用すると、Cookieパラメーターのフィールドからトークンを読み取ることができます。 parameterSectionパラメーターを使用して、トークンを保存するフィールドを指定できます。 次の例では、API GatewayはCookieヘッダーからトークンを読み取ることができます。
Cookie: acw_tc=123; token=0QzRCMDBBQUYwRjE1MjYxQzU0QjY4NEM5MTc1NTQ1OUVCOTIzNzA4RDk3MDg5MzlDOTMQTVENDZCRUI1NkYyMEUyO; csrf=073957d8d2823be4f6c0cad23c764558
4.4。 ブラックリストの設定
JWT認証プラグインは、ブラックリストを使用して、ブラックリストに追加されたが公式トークンを取得したユーザーから送信されたリクエストをブロックします。 プラグインはデータセット機能と連携して、トークンから復号化されたクレームパラメーターに基づいてリクエストを拒否します。 さらに、API Gatewayでは、拒否されたリクエストに対するカスタム応答を設定できます。 次のコードは、JWT認証プラグインでブラックリストを設定する方法の例を示しています。 ブロックで始まるパラメータ定義に注意してください。
---
parameter: Authorization # The parameter from which the token is obtained.
parameterLocation: header # The location from which the token is obtained.
claimParameters: # The claims to be converted into parameters. API Gateway maps JWT claims to backend parameters.
- claimName: aud # The name of the JWT claim, which can be public or private.
parameterName: X-Aud # The name of the backend parameter, to which the JWT claim is mapped.
location: header # The location of the backend parameter, to which the JWT claim is mapped. Valid values: query, header, path, and formData.
- claimName: userId # The name of the JWT claim, which can be public or private.
parameterName: userId # The name of the backend parameter, to which the JWT claim is mapped.
location: query # The location of the backend parameter, to which the JWT claim is mapped. Valid values: query, header, path, and formData.
blockClaimParameterName: userId # The location of the backend parameter, to which the JWT claim is mapped. Valid values: query, header, path, and formData.
blockByDataSet: 87 b65008e92541938537b1a4a236eda5 # The location of the backend parameter, to which the JWT claim is mapped. Valid values: query, header, path, and formData.
blockStatusCode: 403 # The status code of the response that is returned to a rejected request.
blockResponseHeaders: # The header of the response that is returned to a rejected request.
Content-Type: application/xml
blockResponseBody: # The body of the response that is returned to a rejected request.
<Reason>be blocked</Reason>
jwks:
- kid: O9fpdhrViq2zaaaBEWZITz # kid must be set to different values for different JWKs.
kty: RSA
e: AQAB
use: sig
alg: RS256
n: qSVxcknOm0uCq5v....
5. エラーコード
Status | Code | Message | 説明 |
400 | I400JR | JWTが必要 | JWT関連のパラメーターが見つからない場合に返されるエラーメッセージ。 |
403 | S403JI |
|
|
403 | S403JU | JWTのクレーム |
|
403 | A403JT | 無効なJWT: ${理由} | リクエストから読み取られた |
400 | I400JD | JWTのシリアル化に失敗しました: | リクエストから読み取られた |
403 | A403JK | JWK, | リクエストに含まれる |
403 | A403JE | JWTの有効期限は | リクエストから読み取られた |
400 | I400JP | 無効なJWTプラグイン設定: ${JWT} |
|
HTTP応答メッセージに、X-Ca-Error-code
ヘッダーにErrorCodeで指定されたA403JTやI400JD
などの予期しない応答コードが含まれている場合は、jwt.io Webサイトにアクセスしてトークンの有効性と形式を確認します。
6. 制限事項
単一のプラグインのメタデータのサイズは50 KBを超えることはできません。
最大16個のパラメーターを転送するように設定できます。
claimName
パラメーターとparameterName
パラメーターはどちらも32文字を超えることはできません。 次の正規表現のみがサポートされています: [A-Za-z0-9-_] 。alg
は、JWKの場合、RS256、RS384、RS512、ES256、ES512、HS256、HS384、またはHS512に設定できます。