11.9. 凭证用例的 3scale WebAssembly 模块示例


您将花费大部分时间应用配置步骤,在请求您的服务中获取凭证。

以下是 credentials 示例,您可以对其进行修改以符合特定用例的要求。

您可以组合使用它们,尽管当您指定多个源对象和自己的 lookup queries 时,会按照顺序对它们进行评估,直到其中一个成功解析为止。

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_keyapp_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_idapp_key。如果末尾至少输出了一个或两个值,您可以分配 app_key

如果末尾输出了一两个或两个,此处的解决方法将分配 app_key

authorization 标头使用授权类型指定值,其值编码为 Base64。这意味着,您可以通过空格字符来划分值,取第二个输出,然后使用冒号(:)作为分隔符再次分割它。例如,如果您使用这种格式 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 类型和 credential 本身,然后丢弃 credential 类型。
  2. 然后,它会解码包含所需数据的第二个值,并使用冒号(:)字符进行拆分,使其具有一个包含 app_id 的操作堆栈,然后解码 app_key (若存在)。

    1. 如果授权标头中不存在 app_key,则会检查其特定的源。例如,在本例,标头中带有键 app_key
  3. 要向 credentials 添加额外条件,允许 Basic 授权,其中 app_idaladdinadmin,或者任何 app_id 长度至少为 8 个字符。
  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 类型,使类型放置在顶部。
  6. 在其上运行通配匹配。验证凭据并且凭据被解码和分割后,您将获得堆栈底部的 app_id,还可能获得顶部的 app_key
  7. 运行 测试: 如果堆栈中有两个值,表示已获取 app_key

    1. 确保字符串长度介于 1 到 63 之间,包括 app_idapp_key。如果密钥的长度为零,则将其丢弃,并像不存在密钥一样继续。如果只有一个 app_id 且没有 app_key,则缺少的其他分支表示测试和评估成功。

assert,最后一个操作表示它使它进入堆栈没有副作用。然后您可以修改堆栈:

  1. 颠倒堆栈,使 app_id 位于顶部。

    1. 无论是否存在 app_key,取代堆栈可确保 app_id 处于顶级。
  2. 使用 and 在测试期间保留堆栈的内容。

    然后使用以下可能性之一:

    • 确保 app_id 的字符串长度至少为 8。
    • 确保 app_idaladdinadmin 匹配。

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 时,它会使用原生插件配置 Envoy 以验证 JWT 令牌。代理会在运行模块前验证所有内容,因此任何失败的请求都不会将其发送到 3scale WebAssembly 模块。

验证 JWT 令牌时,代理将其内容存储在内部元数据对象中,其键取决于插件的具体配置。通过这个用例,您可以通过包含未知密钥名称的单一条目来查找结构对象。

OIDC 的 3scale app_id 与 OAuth client_id 匹配。这可在 JWT 令牌的 azpaud 字段中找到。

要从 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 身份验证原生插件中查找对象的过滤器元数据。此插件包含 JWT 令牌,作为具有单个条目和预配置名称的结构对象的一部分。使用 0 指定您将仅访问单个条目。

生成值是一个结构,您要解析以下两个字段:

  • azp :找到 app_id 的值。
  • aud: 也可以找到这个信息的值。

该操作可确保仅保留一个值进行分配。

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

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.