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 のヘッダーを確認します。

  1. これは文字列の値を取り、スペースで分割し、credential-type および credential 自体の少なくとも 2 つの値を生成することを確認してから、credential-type をドロップします。
  2. 次に、必要なデータが含まれる 2 番目の値をデコードし、最初の app_id の後にもしあれば app_key が含まれる操作スタックとなるように、コロン (:) 文字を使用して分割します。

    1. app_key が認証ヘッダーに存在しない場合は、その特定のソースがチェックされます。たとえば、この場合はヘッダーにキー app_key が付いています。
  3. credentials に追加の条件を追加するには、Basic 認証を許可します。ここで、app_idaladdin もしくは admin、または 長さが 8 文字以上の任意の app_id になります。
  4. 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
  5. authorization ヘッダーの値を選択したら、タイプが上部に配置されるようにスタックを逆にして Basic credential-type を取得します。
  6. glob マッチを実行します。検証し、認証情報がデコードされ、分割されると、スタックの下部に app_id を取得し、上部に app_key を取得する可能性があります。
  7. test: を実行します。スタックに 2 つの値がある場合は、app_key が取得されたことになります。

    1. app_id および app_key を含め、文字列の長さが 1 から 63 文字になるようにします。キーの長さがゼロの場合は破棄し、キーが存在しないものとして続行します。app_id のみがあり、app_key がない場合、不明なブランチは、テストに成功し、評価が続行されます。

最後の操作は assert で、スタックに副作用がないことを示します。その後、スタックを変更できます。

  1. app_id が最上部になるように、スタックを逆にします。

    1. app_key が存在するかどうかで、スタックを逆にすると、app_id が上部になります。
  2. and を使用して、テスト間でスタックの内容を保持します。

    次に、以下のいずれかの方法を使用します。

    • app_id に 8 文字以上の文字列が設定されていることを確認してください。
    • app_idaladdin または 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
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.