用禁用路由实施Enkoy OAuth2过滤器

发布于 2025-02-11 18:53:00 字数 4368 浏览 3 评论 0原文

我部署了一个特使作为副车来管理OAuth2。一切对于所有资源都很好,并且客户端被重定向到OIDC以进行身份​​验证。 这是我的conf的一部分(在掌舵图中进行管理):

      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          access_log:
          - name: envoy.access_loggers.file
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
              path: /dev/stdout
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: my-service
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: my-service
          http_filters:
          - name: envoy.filters.http.oauth2
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2
              config:
                token_endpoint:
                  cluster: {{ .Values.back.envoy.oidc.name }}
                  uri: https://{{ .Values.back.envoy.oidc.address }}/oidc/token
                  timeout: 5s
                authorization_endpoint: https://{{ .Values.back.envoy.oidc.address }}/oidc/authorize
                redirect_uri: "%REQ(x-forwarded-proto)%://%REQ(:authority)%/oidc/callback"
                redirect_path_matcher:
                  path:
                    exact: /oidc/callback
                signout_path:
                  path:
                    exact: /oidc/signout
                credentials:
                  client_id: {{ required "back.envoy.oidc.client_id is required" .Values.back.envoy.oidc.client_id }}
                  token_secret:
                    name: token
                    sds_config:
                      resource_api_version: V3
                      path: "/etc/envoy/token-secret.yaml"
                  hmac_secret:
                    name: hmac
                    sds_config:
                      resource_api_version: V3
                      path: "/etc/envoy/hmac-secret.yaml"
                forward_bearer_token: true
                # (Optional): defaults to 'user' scope if not provided
                auth_scopes:
                - user
                - openid
                - email
                - homelan_devices_read
                - homelan_topology_read
                - homelan_devices_write
                # (Optional): set resource parameter for Authorization request
                #resources:
                #- oauth2-resource
                #- http://example.com
          - name: envoy.filters.http.router
            typed_config: {}

现在,我希望某些裸露的资源不需要经过身份验证。 我在DOC中看到OAuth过滤器DOC“使用每个过滤器配置,将此空置为特定路线禁用OAuth2。” (请参阅 https://www.envoyproxy.io/docs/envoy/envoy/envoy/latest/latest/api-v3/ap-i-v3/extensions/filters/filters/filters/filters/filters/filters/httpppp/httppp/oauthv3/oauthv3/oauth2/oauth2/oaut v3/oautaut v3/oaut.oaut.oaua aut.oaua aut.oaua aut。 Proto#Envoy-V3-API-MSG-延伸器http-oauth2-v3-oauth2config ) 这个短语使我认为这可能是可能的。 我尝试管理它通过以这种方式更改我的conft virtt virtual_host:

            virtual_hosts:
            - name: no-oauth
              domains: ["*"]
              typed_per_filter_config:
                envoy.filters.http.oauth2:
                  "@type": type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2
              routes:
              - match:
                  prefix: "/api/v1/myResource1"
                route:
                  cluster: my-service
            - name: my-service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/api/v1/myResource2"
                route:
                  cluster: my-service

我有错误:[crialed] [main] [source/server/server.cc:117]错误初始化配置'/etc/envoy/envoy.yaml':the:the Filter Envoy.filters.http.oauth2不支持虚拟主机特定配置

吗?有人是否使用禁用路线实现Envoy OAuth2过滤器?

I deployed an envoy as a side car to manage oauth2. Everything work fine for all the resources and the client is redirected to the OIDC in order to authenticate.
Here is a part of my conf (managed in a Helm chart):

      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          access_log:
          - name: envoy.access_loggers.file
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
              path: /dev/stdout
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: my-service
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: my-service
          http_filters:
          - name: envoy.filters.http.oauth2
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2
              config:
                token_endpoint:
                  cluster: {{ .Values.back.envoy.oidc.name }}
                  uri: https://{{ .Values.back.envoy.oidc.address }}/oidc/token
                  timeout: 5s
                authorization_endpoint: https://{{ .Values.back.envoy.oidc.address }}/oidc/authorize
                redirect_uri: "%REQ(x-forwarded-proto)%://%REQ(:authority)%/oidc/callback"
                redirect_path_matcher:
                  path:
                    exact: /oidc/callback
                signout_path:
                  path:
                    exact: /oidc/signout
                credentials:
                  client_id: {{ required "back.envoy.oidc.client_id is required" .Values.back.envoy.oidc.client_id }}
                  token_secret:
                    name: token
                    sds_config:
                      resource_api_version: V3
                      path: "/etc/envoy/token-secret.yaml"
                  hmac_secret:
                    name: hmac
                    sds_config:
                      resource_api_version: V3
                      path: "/etc/envoy/hmac-secret.yaml"
                forward_bearer_token: true
                # (Optional): defaults to 'user' scope if not provided
                auth_scopes:
                - user
                - openid
                - email
                - homelan_devices_read
                - homelan_topology_read
                - homelan_devices_write
                # (Optional): set resource parameter for Authorization request
                #resources:
                #- oauth2-resource
                #- http://example.com
          - name: envoy.filters.http.router
            typed_config: {}

Now I'd like that some of the exposed resources don't need to be authenticated.
I see in the doc the Oauth filter doc "Leave this empty to disable OAuth2 for a specific route, using per filter config." (see https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/http/oauth2/v3/oauth.proto#envoy-v3-api-msg-extensions-filters-http-oauth2-v3-oauth2config)
This phrase make me think that it may be possible.
I tried to manage it changing my conf throught virtual_hosts this way :

            virtual_hosts:
            - name: no-oauth
              domains: ["*"]
              typed_per_filter_config:
                envoy.filters.http.oauth2:
                  "@type": type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2
              routes:
              - match:
                  prefix: "/api/v1/myResource1"
                route:
                  cluster: my-service
            - name: my-service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/api/v1/myResource2"
                route:
                  cluster: my-service

I have the error : [critical][main] [source/server/server.cc:117] error initializing configuration '/etc/envoy/envoy.yaml': The filter envoy.filters.http.oauth2 doesn't support virtual host-specific configurations

Any idea ? Did someone implement Envoy OAuth2 filter with disabled routes ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吾性傲以野 2025-02-18 18:53:00

看完我的特使日志后,我意识到路径被称为标题“:路径”。
pass_through_matcher数学标题。

然后只添加:

pass_through_matcher:
  - name: ":path"
    prefix_match: "/healthz"
  - name: ":path"
    prefix_match: "/api/v1/myResource1"

在没有LUA过滤器的情况下,在我的conf中(请参阅我以前的答案)。

After looking at my envoy logs, I realized that path is know as header ":path".
The pass_through_matcher math the header.

Then only adding:

pass_through_matcher:
  - name: ":path"
    prefix_match: "/healthz"
  - name: ":path"
    prefix_match: "/api/v1/myResource1"

in my conf without the lua filter (see my previous answer) it works.

树深时见影 2025-02-18 18:53:00

有关信息,我找到了一个解决方法:

在OAuth2 One之前,我添加了一个LUA过滤器:

          - name: envoy.filters.http.lua
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
              inline_code: |
                function envoy_on_request(request_handle)
                  request_handle:headers():add("X-Path", request_handle:headers():get(":path"))
                end

为了将路径添加到标题中。
然后,我可以使用此元素的conf oauth2:

  • pass_through_matcher
    (重复config.route.v3.headermatcher)任何与任何匹配者匹配的请求将通过无OAUTH验证。

因此,我将其添加到我的OAuth2过滤器中:

                pass_through_matcher:
                  - name: "X-path"
                    prefix_match: "/healthz"
                  - name: "X-path"
                    prefix_match: "/api/v1/myResource1"

然后我的/api/v1/myResource1请求(和healthz也)不需要身份验证(从OAuth2中禁用),而my/api/v1/myResource2请求需要它。

我仍然有一个未解决的问题:
OAuth过滤器文档的意思是:“使用每个过滤器配置,将此空白于将其空白于特定路由的OAuth2。”

For information, I found a workaround:

I added a LUA filter before my OAuth2 one:

          - name: envoy.filters.http.lua
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
              inline_code: |
                function envoy_on_request(request_handle)
                  request_handle:headers():add("X-Path", request_handle:headers():get(":path"))
                end

In order to add the path in a header.
Then I can use this element of conf Oauth2:

  • pass_through_matcher
    (repeated config.route.v3.HeaderMatcher) Any request that matches any of the provided matchers will be passed through without OAuth validation.

So I add this to my OAuth2 filter:

                pass_through_matcher:
                  - name: "X-path"
                    prefix_match: "/healthz"
                  - name: "X-path"
                    prefix_match: "/api/v1/myResource1"

Then my /api/v1/myResource1 requests (and healthz also) don't need authentication (are disable from the OAuth2) while my /api/v1/myResource2 requests need it.

I still have got the unanswered question:
What do the OAuth filter doc means with :"Leave this empty to disable OAuth2 for a specific route, using per filter config."

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文