×

threescale-wasm-auth 模块运行在与 Red Hat OpenShift 服务网格 2.1.0 或更高版本集成的 3scale API 管理 2.11 或更高版本上。

threescale-wasm-auth 模块是一个使用一组接口(称为应用程序二进制接口 (ABI))的 WebAssembly 模块。这由 Proxy-WASM 规范定义,用于驱动任何实现 ABI 的软件,以便它可以针对 3scale 授权 HTTP 请求。

作为 ABI 规范,Proxy-WASM 定义了名为主机的软件与名为模块程序扩展的另一个软件之间的交互。主机公开模块用于执行任务的一组服务,在本例中,用于处理代理请求。

主机环境由与软件(在本例中为 HTTP 代理)交互的 WebAssembly 虚拟机组成。

该模块本身与外部世界隔离运行,除非它在虚拟机上运行指令以及Proxy-WASM指定的ABI。这是一种安全地为软件提供扩展点的方法:扩展只能以定义明确的方式与虚拟机和主机交互。这种交互提供了一种计算模型以及代理应该具有的外部世界连接。

兼容性

threescale-wasm-auth 模块旨在完全兼容所有_Proxy-WASM ABI_规范的实现。但是,目前它仅经过彻底测试,可与Envoy反向代理一起使用。

作为独立模块的使用

由于其自包含的设计,可以将此模块配置为独立于服务网格以及3scale Istio适配器部署与Proxy-WASM代理一起工作。

先决条件

  • 该模块适用于所有受支持的3scale版本,除非在配置服务以使用OpenID Connect (OIDC)时,这需要3scale 2.11或更高版本。

配置threescale-wasm-auth模块

OpenShift Container Platform上的集群管理员可以通过应用程序二进制接口 (ABI) 配置threescale-wasm-auth模块以授权对3scale API管理的HTTP请求。ABI定义了主机和模块之间的交互,公开了主机的服务,并允许您使用该模块处理代理请求。

WasmPlugin API扩展

服务网格提供了一个自定义资源定义,用于将Proxy-WASM扩展指定并应用于sidecar代理,称为WasmPlugin。服务网格将此自定义资源应用于需要使用3scale进行HTTP API管理的工作负载集。

有关更多信息,请参见自定义资源定义

目前,配置WebAssembly扩展是一个手动过程。从3scale系统获取服务配置的支持将在未来的版本中提供。

先决条件
  • 在您的服务网格部署中标识一个Kubernetes工作负载和命名空间,您将在其中应用此模块。

  • 您必须拥有一个3scale租户帐户。请参阅SaaS3scale 2.11本地部署,并定义匹配的服务以及相关的应用程序和指标。

  • 如果您将模块应用于<product_page>bookinfo命名空间中的微服务,请参阅Bookinfo示例应用程序

    • 以下示例是threescale-wasm-auth模块的自定义资源的YAML格式。此示例指的是服务网格的Maistra上游版本,WasmPlugin API。您必须声明部署threescale-wasm-auth模块的命名空间,以及一个selector来标识模块将应用到的应用程序集。

      apiVersion: extensions.istio.io/v1alpha1
      kind: WasmPlugin
      metadata:
        name: <threescale_wasm_plugin_name>
        namespace: <bookinfo> (1)
      spec:
        selector: (2)
          labels:
            app: <product_page>
        pluginConfig: <yaml_configuration>
        url: oci://registry.redhat.io/3scale-amp2/3scale-auth-wasm-rhel8:0.0.3
        phase: AUTHZ
        priority: 100
      1 namespace
      2 selector
  • spec.pluginConfig字段取决于模块配置,在之前的示例中没有填充。相反,该示例使用<yaml_configuration>占位符值。您可以使用此自定义资源示例的格式。

    • spec.pluginConfig字段根据应用程序而有所不同。所有其他字段在多个此自定义资源实例中保持不变。例如:

      • url:仅在部署较新版本的模块时才会更改。

      • phase:保持不变,因为此模块需要在代理完成任何本地授权(例如验证OpenID Connect (OIDC)令牌)后才能调用。

  • 在您拥有spec.pluginConfig中的模块配置和其余自定义资源后,使用oc apply命令应用它。

    $ oc apply -f threescale-wasm-auth-bookinfo.yaml

应用3scale外部ServiceEntry对象

为了使threescale-wasm-auth模块针对3scale授权请求,该模块必须能够访问3scale服务。您可以在Red Hat OpenShift Service Mesh中通过应用外部ServiceEntry对象和相应的DestinationRule对象(用于TLS配置以使用HTTPS协议)来实现。

自定义资源 (CR) 为从服务网格内部安全访问3scale托管(SaaS)的服务管理API和帐户管理API的后端和系统组件设置服务条目和目标规则。服务管理API接收每个请求的授权状态查询。帐户管理API提供服务的API管理配置设置。

步骤
  1. 将以下外部ServiceEntry CR和相关的DestinationRule CR应用于3scale托管**后端**到您的集群

    1. ServiceEntry CR添加到名为service-entry-threescale-saas-backend.yml的文件中

      ServiceEntry CR
      apiVersion: networking.istio.io/v1beta1
      kind: ServiceEntry
      metadata:
        name: service-entry-threescale-saas-backend
      spec:
        hosts:
        - su1.3scale.net
        ports:
        - number: 443
          name: https
          protocol: HTTPS
        location: MESH_EXTERNAL
        resolution: DNS
    2. DestinationRule CR添加到名为destination-rule-threescale-saas-backend.yml的文件中

      DestinationRule CR
      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: destination-rule-threescale-saas-backend
      spec:
        host: su1.3scale.net
        trafficPolicy:
          tls:
            mode: SIMPLE
            sni: su1.3scale.net
    3. 通过运行以下命令,将外部ServiceEntry CR应用并保存到您的集群中,用于3scale托管后端

      $ oc apply -f service-entry-threescale-saas-backend.yml
    4. 通过运行以下命令,将外部DestinationRule CR应用并保存到您的集群中,用于3scale托管后端

      $ oc apply -f destination-rule-threescale-saas-backend.yml
  2. 将以下外部ServiceEntry CR和相关的DestinationRule CR应用于3scale托管**系统**到您的集群

    1. ServiceEntry CR添加到名为service-entry-threescale-saas-system.yml的文件中

      ServiceEntry CR
      apiVersion: networking.istio.io/v1beta1
      kind: ServiceEntry
      metadata:
        name: service-entry-threescale-saas-system
      spec:
        hosts:
        - multitenant.3scale.net
        ports:
        - number: 443
          name: https
          protocol: HTTPS
        location: MESH_EXTERNAL
        resolution: DNS
    2. DestinationRule CR添加到名为destination-rule-threescale-saas-system.yml的文件中

      DestinationRule CR
      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: destination-rule-threescale-saas-system
      spec:
        host: multitenant.3scale.net
        trafficPolicy:
          tls:
            mode: SIMPLE
            sni: multitenant.3scale.net
    3. 通过运行以下命令,将外部ServiceEntry CR应用并保存到您的集群中,用于3scale托管系统

      $ oc apply -f service-entry-threescale-saas-system.yml
    4. 通过运行以下命令,将外部DestinationRule CR应用并保存到您的集群中,用于3scale托管系统

      $ oc apply -f <destination-rule-threescale-saas-system.yml>

或者,您可以部署一个网内3scale服务。要部署网内3scale服务,请通过部署3scale并链接到部署来更改CR中服务的 location。

3scale WebAssembly模块配置

WasmPlugin自定义资源规范提供了Proxy-WASM模块从中读取的配置。

规范嵌入在主机中,并由Proxy-WASM模块读取。通常,配置采用JSON文件格式供模块解析,但是WasmPlugin资源可以将规范值解释为YAML,并将其转换为JSON供模块使用。

如果您以独立模式使用Proxy-WASM模块,则必须使用JSON格式编写配置。使用JSON格式意味着在host配置文件(例如Envoy)中需要使用转义和引号。当您将WebAssembly模块与WasmPlugin资源一起使用时,配置采用YAML格式。在这种情况下,无效的配置会强制模块根据其JSON表示向sidecar的日志流显示诊断信息。

EnvoyFilter自定义资源不是受支持的API,尽管它可以在某些3scale Istio适配器或服务网格版本中使用。不推荐使用EnvoyFilter自定义资源。请使用WasmPlugin API代替EnvoyFilter自定义资源。如果必须使用EnvoyFilter自定义资源,则必须使用JSON格式指定规范。

配置3scale WebAssembly模块

3scale WebAssembly 模块配置的架构取决于 3scale 账户和授权服务,以及要处理的服务列表。

先决条件

前提是在所有情况下都必须设置一组最小必填字段。

  • 对于 3scale 账户和授权服务:backend-listener URL。

  • 对于要处理的服务列表:服务 ID 以及至少一种凭据查找方法及其查找位置。

  • 您将找到处理userkey、带有appkeyappid以及 OpenID Connect (OIDC) 模式的示例。

  • WebAssembly 模块使用您在静态配置中指定的设置。例如,如果您向模块添加映射规则配置,即使 3scale 管理门户没有此类映射规则,它也将始终应用。其余的 WasmPlugin 资源围绕 spec.pluginConfig YAML 条目存在。

3scale WebAssembly 模块 api 对象

来自 3scale WebAssembly 模块的顶级字符串 api 定义了模块将使用的配置版本。

api 对象不存在或不支持的版本将导致 3scale WebAssembly 模块无法运行。

api 顶级字符串示例
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
  namespace: <bookinfo>
spec:
  pluginConfig:
    api: v1
# ...

api 条目定义了配置的其余值。唯一接受的值是 v1。破坏与当前配置兼容性的新设置或需要模块使用 v1 无法处理的更多逻辑,将需要不同的值。

3scale WebAssembly 模块系统对象

顶级对象 system 指定如何访问特定帐户的 3scale 帐户管理 API。upstream 字段是该对象中最重要的部分。system 对象是可选的,但建议使用,除非您为 3scale WebAssembly 模块提供完全静态的配置,如果您不想提供与 3scale 的系统组件的连接,这是一个选项。

当您除了 system 对象之外还提供静态配置对象时,静态对象始终优先。

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  pluginConfig:
    system:
      name: <saas_porta>
      upstream: <object>
      token: <my_account_token>
      ttl: 300
# ...
表 1. system 对象字段
名称 描述 必填

name

3scale 服务的标识符,目前未在其他地方引用。

可选

upstream

有关要联系的网络主机的详细信息。upstream 指的是称为系统的 3scale 帐户管理 API 主机。

token

具有读取权限的 3scale 个人访问令牌。

ttl

在尝试获取新的更改之前,将从该主机检索到的配置视为有效的最小秒数。默认值为 600 秒(10 分钟)。**注意:**没有最大值,但模块通常会在此 TTL 过期后的合理时间内获取任何配置。

可选

3scale WebAssembly 模块上游对象

upstream 对象描述代理可以对其执行调用的外部主机。

apiVersion: maistra.io/v1
upstream:
  name: outbound|443||multitenant.3scale.net
  url: "https://myaccount-admin.3scale.net/"
  timeout: 5000
# ...
表 2. upstream 对象字段
名称 描述 必填

name

name 不是自由格式的标识符。它是代理配置中定义的外部主机的标识符。在独立 Envoy 配置的情况下,它映射到 集群 的名称,在其他代理中也称为 upstream。**注意:**此字段的值,因为服务网格和 3scale Istio 适配器控制平面根据使用竖线 (|) 作为多个字段分隔符的格式配置名称。出于此集成的目的,始终使用以下格式:outbound|<port>||<hostname>

url

访问所描述服务的完整 URL。除非方案隐含,否则必须包含 TCP 端口。

超时

以毫秒为单位的超时,以便响应时间超过该时间的此服务的连接将被视为错误。默认值为 1000 秒。

可选

3scale WebAssembly 模块后端对象

顶级对象 backend 指定如何访问 3scale 服务管理 API 以授权和报告 HTTP 请求。此服务由 3scale 的后端组件提供。

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  pluginConfig:
# ...
    backend:
      name: backend
      upstream: <object>
# ...
表 3. backend 对象字段
名称 描述 必填

name

3scale 后端的标识符,目前未在其他地方引用。

可选

upstream

有关要联系的网络主机的详细信息。这必须指 3scale 帐户管理 API 主机,即系统。

是。最重要且必填的字段。

3scale WebAssembly 模块服务对象

顶级对象 services 指定此特定 module 实例处理哪些服务标识符。

由于帐户具有多个服务,因此您必须指定要处理的服务。其余配置围绕如何配置服务展开。

services 字段是必需的。它是一个数组,必须包含至少一项服务才能发挥作用。

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  pluginConfig:
# ...
    services:
    - id: "2555417834789"
      token: service_token
      authorities:
        - "*.app"
        - 0.0.0.0
        - "0.0.0.0:8443"
      credentials: <object>
      mapping_rules: <object>
# ...

services 数组中的每个元素都代表一个 3scale 服务。

表 4. services 对象字段
名称 描述 必填

ID

此 3scale 服务的标识符,目前未在其他地方引用。

token

token 可在系统中您的服务的代理配置中找到,或者您可以使用以下 curl 命令从系统中检索它

curl https://<system_host>/admin/api/services/<service_id>/proxy/configs/production/latest.json?access_token=<access_token>" | jq '.proxy_config.content.backend_authentication_value'

可选

authorities

字符串数组,每个字符串代表要匹配的URLAuthority。这些字符串接受支持星号(*)、加号(+)和问号(?)匹配器的 glob 模式。

credentials

定义要查找哪种凭据以及执行此操作的步骤的对象。

mapping_rules

表示映射规则和要命中的 3scale 方法的对象数组。

可选

3scale WebAssembly 模块凭据对象

credentials 对象是 service 对象的一个组件。credentials 指定要查找哪种凭据以及执行此操作的步骤。

所有字段都是可选的,但您必须至少指定一个 user_keyapp_id。您指定每个凭据的顺序无关紧要,因为它是由模块预先确定的。每个凭据只指定一个实例。

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  pluginConfig:
# ...
    services:
    - credentials:
        user_key: <array_of_lookup_queries>
        app_id: <array_of_lookup_queries>
        app_key: <array_of_lookup_queries>
# ...
表 5. credentials 对象字段
名称 描述 必填

user_key

这是一个查找查询数组,它定义了 3scale 用户密钥。用户密钥通常称为 API 密钥。

可选

app_id

这是一个查找查询数组,用于定义 3scale 应用程序标识符。应用程序标识符由 3scale 提供,或者使用身份提供商(例如 Red Hat Single Sign-On (RH-SS0) 或 OpenID Connect (OIDC))提供。这些查找查询的解析结果,如果成功并解析为两个值,则会设置app_idapp_key

可选

app_key

这是一个查找查询数组,用于定义 3scale 应用程序密钥。没有解析的app_id的应用程序密钥是无用的,因此只有在指定app_id时才指定此字段。

可选

3scale WebAssembly 模块查找查询

lookup query 对象是credentials对象中任何字段的一部分。它指定如何查找和处理给定的凭据字段。评估时,成功解析意味着找到一个或多个值。解析失败意味着未找到任何值。

lookup queries数组描述了一个短路或关系:一个查询的成功解析会停止对任何剩余查询的评估,并将值分配给指定的凭据类型。数组中的每个查询都是相互独立的。

lookup query由单个字段组成,即源对象,它可以是多种源类型之一。请参见以下示例

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  pluginConfig:
# ...
    services:
    - credentials:
        user_key:
          - <source_type>: <object>
          - <source_type>: <object>
# ...
        app_id:
          - <source_type>: <object>
# ...
        app_key:
          - <source_type>: <object>
# ...

3scale WebAssembly 模块源对象

source对象存在于credentials对象字段内的一组源数组中。对象字段名称(称为source类型)可以是以下任何一种:

  • header:查找查询接收 HTTP 请求标头作为输入。

  • query_stringlookup query接收 URL 查询字符串参数作为输入。

  • filterlookup query接收过滤器元数据作为输入。

所有source类型对象至少具有以下两个字段:

表 6. source类型对象字段
名称 描述 必填

keys

字符串数组,每个字符串都是一个key,指的是在输入数据中找到的条目。

ops

执行key条目匹配的operations数组。该数组是一个管道,其中操作接收输入并在下一个操作上生成输出。一个operation未能提供输出将导致lookup query解析失败。操作的管道顺序决定了评估顺序。

可选

filter字段名称需要一个path条目,以显示您用于查找数据的元数据中的路径。

key与输入数据匹配时,其余密钥将不会被评估,并且源解析算法将跳转到执行指定的operationsops),如果有的话。如果没有指定ops,则返回匹配key的结果值(如果有)。

Operations提供了一种方法来指定在第一阶段查找key后拥有的输入的某些条件和转换。当您需要转换、解码和断言属性时,请使用operations,但是它们没有提供成熟的语言来处理所有需求,并且缺乏图灵完备性。

一个堆栈存储operations的输出。评估时,lookup query通过将堆栈底部的值分配给值来完成,具体取决于凭据消耗多少个值。

3scale WebAssembly 模块操作对象

属于特定source typeops数组中的每个元素都是一个operation对象,它可以对值应用转换或执行测试。用于此类对象的字段名称是operation本身的名称,任何值都是operation的参数,例如结构对象、带有字段和值的映射、列表或字符串。

大多数operations处理一个或多个输入,并产生一个或多个输出。当它们使用输入或产生输出时,它们使用值堆栈:操作使用的每个值都从值堆栈中弹出,并最初填充任何source匹配项。它们输出的值被推送到堆栈中。其他operations除了断言某些属性之外,不使用或产生输出,但它们会检查值堆栈。

解析完成后,下一步拾取的值(例如,将值分配为app_idapp_keyuser_key)将从堆栈底部的值中获取。

有几种不同的operations类别:

  • decode:这些通过解码输入值来获得不同的格式。

  • string:这些以字符串值作为输入,并对其进行转换和检查。

  • stack:这些采用输入中的值集,并执行多个堆栈转换和选择堆栈中的特定位置。

  • check:这些以无副作用的方式断言操作集的属性。

  • control:这些执行允许修改评估流程的操作。

  • format:这些解析输入值的特定格式结构并在其中查找值。

所有操作都由名称标识符(字符串)指定。

其他资源

3scale WebAssembly 模块 mapping_rules 对象

mapping_rules对象是service对象的一部分。它指定一组 REST 路径模式以及在模式匹配时要使用的相关 3scale 指标和计数增量。

如果system顶级对象中没有提供动态配置,则需要此值。如果除了system顶级条目之外还提供了该对象,则首先评估mapping_rules对象。

mapping_rules是一个数组对象。该数组的每个元素都是一个mapping_rule对象。对传入请求进行评估匹配的映射规则提供用于授权和向APIManager报告的 3scalemethods集。当多个匹配规则引用相同的methods时,在调用 3scale 时会对deltas进行求和。例如,如果两个规则使用deltas为 1 和 3 将Hits方法增加两次,则向 3scale 报告的 Hits 的单个方法条目具有 4 的delta

3scale WebAssembly 模块 mapping_rule 对象

mapping_rule 对象是 mapping_rules 对象中数组的一部分。

mapping_rule 对象的字段指定以下信息:

  • 要匹配的 *HTTP 请求方法*。

  • 用于匹配路径的模式。

  • 要报告的 3scale 方法及其报告数量。您指定字段的顺序决定了评估顺序。

表 7. mapping_rule 对象字段
名称 描述 必填

method

指定表示 HTTP 请求方法(也称为谓词)的字符串。接受的值与任何接受的 HTTP 方法名称匹配,不区分大小写。特殊值 any 匹配任何方法。

pattern

用于匹配 HTTP 请求的 URI 路径组件的模式。此模式遵循 3scale 文档中记录的相同语法。它允许使用通配符(使用星号 (*) 字符),使用花括号之间任意字符序列,例如 {this}

usages

usage 对象列表。当规则匹配时,所有带有 deltas 的方法都将添加到发送到 3scale 以进行授权和报告的方法列表中。

使用以下必需字段嵌入 usages 对象:

  • name:要报告的 method 系统名称。

  • delta:要增加该 method 的数量。

last

此规则的成功匹配是否应停止评估更多映射规则。

可选布尔值。默认为 false

以下示例独立于 3scale 中方法之间现有的层次结构。也就是说,在 3scale 端运行的任何内容都不会影响这一点。例如,*Hits* 指标可能是它们所有者的父指标,因此它由于授权请求中所有报告方法的总和而存储 4 次点击,并调用 3scale Authrep API 端点。

下面的示例使用 GET 请求访问路径 /products/1/sold,该路径与所有规则匹配。

mapping_rules GET 请求示例
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  pluginConfig:
# ...
    mapping_rules:
      - method: GET
        pattern: /
        usages:
          - name: hits
            delta: 1
      - method: GET
        pattern: /products/
        usages:
          - name: products
            delta: 1
      - method: ANY
        pattern: /products/{id}/sold
        usages:
          - name: sales
            delta: 1
          - name: products
            delta: 1
# ...

所有 usages 都将添加到模块对 3scale 执行的使用数据请求中,如下所示:

  • Hits:1

  • products:2

  • sales:1

凭据用例的 3scale WebAssembly 模块示例

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

以下是您可以修改以适应特定用例的 credentials 示例。

您可以将它们全部组合在一起,但是当您指定多个具有自己 lookup queries 的源对象时,它们会按顺序进行评估,直到其中一个成功解析。

查询字符串参数中的 API 密钥 (user_key)

以下示例在同名的查询字符串参数或标头中查找 user_key

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
# ...
    services:
# ...
      credentials:
        user_key:
          - query_string:
              keys:
                - <user_key>
          - header:
              keys:
                - <user_key>
# ...

应用程序 ID 和密钥

以下示例在查询或标头中查找 app_keyapp_id 凭据。

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
# ...
    services:
# ...
      credentials:
        app_id:
          - query_string:
              keys:
                - <app_id>
          - header:
              keys:
                - <app_id>
        app_key:
          - query_string:
              keys:
                - <app_key>
          - header:
              keys:
                - <app_key>
# ...

授权标头

请求在 authorization 标头中包含 app_idapp_key。如果最终输出至少一个或两个值,则可以分配 app_key

此处的解析如果最终输出一个或两个值,则分配 app_key

authorization 标头指定一个值,该值包含授权类型,其值编码为 Base64。这意味着您可以使用空格字符分割该值,获取第二个输出,然后再次使用冒号 (:) 作为分隔符进行分割。例如,如果您使用此格式 app_id:app_key,则 credential 的标头如下例所示。

aladdin:opensesame:  Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l

您必须使用如下例所示的小写标头字段名称。

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
# ...
    services:
# ...
      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. 如果 authorization 标头中不存在 app_key,则会检查其特定来源,例如在这种情况下,键为 app_key 的标头。

  3. 要向 credentials 添加额外条件,请允许 Basic 授权,其中 app_idaladdinadmin,或者任何 app_id 的长度至少为 8 个字符。

  4. app_key 必须包含一个值,并且长度至少为 64 个字符,如下例所示。

    apiVersion: extensions.istio.io/v1alpha1
    kind: WasmPlugin
    metadata:
      name: <threescale_wasm_plugin_name>
    spec:
    # ...
        services:
    # ...
          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. 对其运行 glob 匹配。当它验证并且凭据被解码和分割时,您会在堆栈底部获得 app_id,并且可能在顶部获得 app_key

  7. 运行 test: 检查堆栈中是否存在两个值,这意味着获得了 app_key

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

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

  1. 反转堆栈,使 app_id 位于顶部。

    1. 无论是否存在 app_key,反转堆栈都能确保 app_id 位于顶部。

  2. 使用 and 保留测试期间堆栈的内容。

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

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

    • 确保 app_id 匹配 aladdinadmin

OpenID Connect (OIDC) 用例

对于服务网格和 3scale Istio 适配器,您必须部署 RequestAuthentication,如下例所示,填写您自己的工作负载数据和 jwtRules

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: jwt-example
  namespace: bookinfo
spec:
  selector:
    matchLabels:
      app: productpage
  jwtRules:
  - issuer: >-
      http://keycloak-keycloak.34.242.107.254.nip.io/auth/realms/3scale-keycloak
    jwksUri: >-
      http://keycloak-keycloak.34.242.107.254.nip.io/auth/realms/3scale-keycloak/protocol/openid-connect/certs

应用 RequestAuthentication 时,它会使用 原生插件 配置 Envoy 以验证 JWT 令牌。代理会在运行模块之前验证所有内容,因此任何失败的请求都不会到达 3scale WebAssembly 模块。

验证 JWT 令牌时,代理会将其内容存储在内部元数据对象中,其中一个条目的键取决于插件的特定配置。此用例使您可以使用包含未知键名称的单个条目的结构对象进行查找。

3scale 的 `app_id` 与 OIDC 的 OAuth `client_id` 相匹配。这可以在 JWT 令牌的 `azp` 或 `aud` 字段中找到。

要从 Envoy 的原生 JWT 身份验证过滤器中获取 `app_id` 字段,请参见以下示例

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
# ...
    services:
# ...
      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`:也可以找到此信息的值。

此操作确保只保留一个值用于赋值。

从标头中获取 JWT 令牌

某些设置可能具有针对 JWT 令牌的验证过程,其中已验证的令牌将通过 JSON 格式的标头到达此模块。

要获取 `app_id`,请参见以下示例

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
# ...
    services:
# ...
      credentials:
        app_id:
          - header:
              keys:
                - x-jwt-payload
              ops:
                - base64_urlsafe
                - json:
                  - keys:
                    - azp
                    - aud
                - take:
                    head: 1
# ,,,

3scale WebAssembly 模块最小工作配置

以下是 3scale WebAssembly 模块最小工作配置的示例。您可以复制并粘贴此配置,并根据您的实际配置进行修改。

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: <threescale_wasm_plugin_name>
spec:
  url: oci://registry.redhat.io/3scale-amp2/3scale-auth-wasm-rhel8:0.0.3
  imagePullSecret: <optional_pull_secret_resource>
  phase: AUTHZ
  priority: 100
  selector:
    labels:
      app: <product_page>
  pluginConfig:
    api: v1
    system:
      name: <system_name>
      upstream:
        name: outbound|443||multitenant.3scale.net
        url: https://istiodevel-admin.3scale.net/
        timeout: 5000
      token: <token>
    backend:
      name: <backend_name>
      upstream:
        name: outbound|443||su1.3scale.net
        url: https://su1.3scale.net/
        timeout: 5000
      extensions:
      - no_body
    services:
    - id: '2555417834780'
      authorities:
      - "*"
      credentials:
        user_key:
          - query_string:
              keys:
                - <user_key>
          - header:
              keys:
                - <user_key>
        app_id:
          - query_string:
              keys:
                - <app_id>
          - header:
              keys:
                - <app_id>
        app_key:
          - query_string:
              keys:
                - <app_key>
          - header:
              keys:
                - <app_key>