11.9. 認証情報ユースケースの 3scale WebAssembly モジュールの例
ほとんどの時間を費やして、設定手順を適用してサービスへのリクエストの認証情報を取得します。
以下は credentials
の例です。これは、特定のユースケースに合わせて変更できます。
複数のソースオブジェクトと独自の lookup queries
を指定する場合、これらはすべて組み合わせることができますが、いずれか 1 つが正しく解決されるまで、それらは順番に評価されます。
11.9.1. クエリー文字列パラメーターの API キー (user_key)
以下の例では、クエリー文字列パラメーターまたは同じ名前のヘッダーで user_key
を検索します。
credentials: user_key: - query_string: keys: - user_key - header: keys: - user_key
11.9.2. アプリケーション ID およびキー
以下の例では、クエリーまたはヘッダーの app_key
および app_id
認証情報を検索します。
credentials: app_id: - header: keys: - app_id - query_string: keys: - app_id app_key: - header: keys: - app_key - query_string: keys: - app_key
11.9.3. 認証ヘッダー
リクエストには、authorization
ヘッダーに app_id
および app_key
が含まれます。最後に出力される値が 1 つまたは 2 つある場合は、app_key
を割り当てることができます。
ここでの解決は、最後に出力された 1 つまたは 2 つの出力がある場合は app_key
を割り当てます。
authorization
ヘッダーは承認の種類で値を指定し、その値は Base64
としてエンコードされます。つまり、値を空白文字で分割し、2 番目の出力を取得して、コロン (:) をセパレーターとして使用して再度分割できます。たとえば、app_id:app_key
という形式を使用する場合、ヘッダーは以下の credential
の例のようになります。
aladdin:opensesame: Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
次の例に示すように、ヘッダーフィールド名は小文字を使用する必要があります。
credentials: app_id: - header: keys: - authorization ops: - split: separator: " " max: 2 - length: min: 2 - drop: head: 1 - base64_urlsafe - split: max: 2 app_key: - header: keys: - app_key
前述のユースケースの例は、authorization
のヘッダーを確認します。
-
これは文字列の値を取り、スペースで分割し、
credential
-type およびcredential
自体の少なくとも 2 つの値を生成することを確認してから、credential
-type をドロップします。 次に、必要なデータが含まれる 2 番目の値をデコードし、最初の
app_id
の後にもしあればapp_key
が含まれる操作スタックとなるように、コロン (:) 文字を使用して分割します。-
app_key
が認証ヘッダーに存在しない場合は、その特定のソースがチェックされます。たとえば、この場合はヘッダーにキーapp_key
が付いています。
-
-
credentials
に追加の条件を追加するには、Basic
認証を許可します。ここで、app_id
はaladdin
もしくはadmin
、または 長さが 8 文字以上の任意のapp_id
になります。 app_key
には値が含まれ、以下の例のように最小で 64 文字を指定する必要があります。credentials: app_id: - header: keys: - authorization ops: - split: separator: " " max: 2 - length: min: 2 - reverse - glob: - Basic - drop: tail: 1 - base64_urlsafe - split: max: 2 - test: if: length: min: 2 then: - strlen: max: 63 - or: - strlen: min: 1 - drop: tail: 1 - assert: - and: - reverse - or: - strlen: min: 8 - glob: - aladdin - admin
-
authorization
ヘッダーの値を選択したら、タイプが上部に配置されるようにスタックを逆にしてBasic
credential
-type を取得します。 -
glob マッチを実行します。検証し、認証情報がデコードされ、分割されると、スタックの下部に
app_id
を取得し、上部にapp_key
を取得する可能性があります。 test:
を実行します。スタックに 2 つの値がある場合は、app_key
が取得されたことになります。-
app_id
およびapp_key
を含め、文字列の長さが 1 から 63 文字になるようにします。キーの長さがゼロの場合は破棄し、キーが存在しないものとして続行します。app_id
のみがあり、app_key
がない場合、不明なブランチは、テストに成功し、評価が続行されます。
-
最後の操作は assert
で、スタックに副作用がないことを示します。その後、スタックを変更できます。
app_id
が最上部になるように、スタックを逆にします。-
app_key
が存在するかどうかで、スタックを逆にすると、app_id
が上部になります。
-
and
を使用して、テスト間でスタックの内容を保持します。次に、以下のいずれかの方法を使用します。
-
app_id
に 8 文字以上の文字列が設定されていることを確認してください。 -
app_id
がaladdin
またはadmin
と一致していることを確認します。
-
11.9.4. OpenID Connect (OIDC) のユースケース
Service Mesh および 3scale Istio アダプターの場合は、以下の例のように RequestAuthentication
をデプロイし、独自のワークロードデータおよび jwtRules
を入力する必要があります。
apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: jwt-example namespace: <info> spec: selector: matchLabels: app: <productpage> jwtRules: - issuer: >- "<url>/auth/realms/<realm_name>" jwksUri: >- "<url>/auth/realms/<realm_name>/protocol/openid-connect/certs"
RequestAuthentication
を適用するとき、JWT
トークンを検証するためにネイティブプラグインで Envoy
を設定します。プロキシーは、モジュールを実行する前にすべてを検証します。したがって、失敗したリクエストが 3scale WebAssembly モジュールに実行されません。
JWT
トークンが検証されると、プロキシーはそのコンテンツを内部メタデータオブジェクトに格納します。エントリーのキーは、プラグインの特定の設定に依存します。このユースケースでは、不明なキー名が含まれる単一のエントリーを持つ構造化オブジェクトを検索できます。
OIDC の 3scale app_id
は、OAuth client_id
と一致します。これは JWT
トークンの azp
フィールドまたは aud
フィールドにあります。
Envoy のネイティブ JWT
認証フィルターから app_id
フィールドを取得するには、以下の例を参照してください。
credentials: app_id: - filter: path: - envoy.filters.http.jwt_authn - "0" keys: - azp - aud ops: - take: head: 1
この例では、モジュールに対し、filter
ソースタイプを使用して Envoy
固有の JWT
認証ネイティブプラグインからオブジェクトのフィルターメタデータを検索するよう指示します。このプラグインには、1 つのエントリーと事前に設定された名前を持つ構造化オブジェクトの一部として JWT
トークンが含まれます。0
を使用して、単一のエントリーのみにアクセスするように指定します。
結果の値は、以下の 2 つのフィールドを解決する構造です。
-
azp
:app_id
が見つけられる値。 -
aud
: この情報も見つけられる値。
この操作により、割り当て用に 1 つの値のみが保持されます。
11.9.5. ヘッダーからの JWT トークンの取得
一部のセットアップには、JWT
トークンの検証プロセスがあり、検証されたトークンが JSON 形式のヘッダーを介してこのモジュールに到達する場合があります。
app_id
を取得するには、以下の例を参照してください。
credentials: app_id: - header: keys: - x-jwt-payload ops: - base64_urlsafe - json: - keys: - azp - aud - take: head: 1