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_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
。如果末尾至少输出了一个或两个值,您可以分配 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
标头:
-
它接受字符串值并通过空格分割,检查它是否至少生成两个
credential
类型和credential
本身,然后丢弃credential
类型。 然后,它会解码包含所需数据的第二个值,并使用冒号(:)字符进行拆分,使其具有一个包含
app_id
的操作堆栈,然后解码app_key
(若存在)。-
如果授权标头中不存在
app_key
,则会检查其特定的源。例如,在本例,标头中带有键app_key
。
-
如果授权标头中不存在
-
要向
credentials
添加额外条件,允许Basic
授权,其中app_id
是aladdin
或admin
,或者任何app_id
长度至少为 8 个字符。 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
类型,使类型放置在顶部。 -
在其上运行通配匹配。验证凭据并且凭据被解码和分割后,您将获得堆栈底部的
app_id
,还可能获得顶部的app_key
。 运行
测试:
如果堆栈中有两个值,表示已获取app_key
。-
确保字符串长度介于 1 到 63 之间,包括
app_id
和app_key
。如果密钥的长度为零,则将其丢弃,并像不存在密钥一样继续。如果只有一个app_id
且没有app_key
,则缺少的其他分支表示测试和评估成功。
-
确保字符串长度介于 1 到 63 之间,包括
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
时,它会使用原生插件配置 Envoy
以验证 JWT
令牌。代理会在运行模块前验证所有内容,因此任何失败的请求都不会将其发送到 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
身份验证原生插件中查找对象的过滤器元数据。此插件包含 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