EnvoyFilter jwt_authn

我正在尝试使用EnvoyFilter从请求中传递jwt负载,解码并将声明作为请求头使用。

它没有起作用,我无法在使用jwt_authn之后用负载填充dynamicMetadata。

这是我正在使用的jwt_authn过滤器的示例:

apiVersion:networking.istio.io / v1alpha3
kind:EnvoyFilter
metadata:
  name:jwt-filter
  namespace:istio-system
spec:
  workloadSelector:
    labels:
      app:app1
  configPatches:
    - applyTo:HTTP_FILTER
      match:
        context:SIDECAR_INBOUND
        listener:
          portNumber:3000
          filterChain:
            filter:
              name:"envoy.http_connection_manager"
              subFilter:
                name:"envoy.router"
      patch:
        operation:INSERT_BEFORE
        value:
          name:envoy.filters.http.jwt_authn
          typed_config:
            "@type""type.googleapis.com/envoy.config.filter.http.jwt_authn.v2alpha.JwtProvider"
            providers:
              authority_jwks:
                issuer:"testing@secure.istio.io"
                remote_jwks:
                  http_uri:
                    uri:"https://raw.githubusercontent.com/istio/istio/master/security/tools/jwt/samples/jwks.json"
                    timeout:5s
                  cache_duration:3600s
                forward:true
                payload_in_metadata:"jwt-metadata"
                forward_payload_header:"jwt-header"

我假设:

  • 对于第一步,如果我的应用程序正在打印请求标头,则jwt-header应该是其中一个标头,并包括加密的jwt。
  • 如果我使用的是获取DynamicMetadata的Envoy lua过滤器,则需要包括jwt-metadata字段。

不是吗?

点赞
用户14532307
用户14532307

将下面翻译成中文并且保留原本的 markdown 格式

JWT 过滤器默认从 "Authorization: Bearer" 标头中提取 JWT 令牌。 你知道 Envoy 是否能够读取它吗?

当以跟踪级别记录日志运行 Envoy 时,你还可以检查 envoy 日志。 它会打印 jwt_authn 日志,显示过滤器正在执行的内容。

2020-11-11 20:49:13
用户14242404
用户14242404

我已经解决了它。

明显当使用 requestsAuthentication 时,jwt_authn 是默认使用的,我不需要在 EnvoyFilter 中特别定义它。

我的做法是添加一个Lua脚本的EnvoyFilter,用于获取如下所示的解密JWT令牌:

metadata = request_handle:streamInfo():dynamicMetadata():get("envoy.filters.http.jwt_authn")
claims=metadata["testing@secure.istio.io"]

十分感谢。

2020-11-17 11:21:23