如何配置Envoy OAuth2过滤器实现指定路由免认证
问题根因
报错核心原因是Envoy官方的OAuth2过滤器不支持Virtual Host层级的per_filter_config配置,文档提到的逐路由禁用OAuth2能力,仅支持在单个Route路由条目层级配置。你之前将禁用规则挂在virtual_hosts的typed_per_filter_config字段下,会直接触发配置校验失败。
另外你之前写的禁用规则位置错误,也不需要拆分多个同域名的Virtual Host,这种写法本身就会导致路由匹配逻辑混乱。
可落地方案
直接将需要免认证的路由放在路由表最靠前的位置(Envoy路由按从上到下的顺序优先匹配),在对应单路由条目下配置per_filter_config传入空的OAuth2配置,即可实现该路由跳过认证的效果,其余路由默认继承全局的OAuth2认证配置。
正确配置示例
调整HttpConnectionManager下的route_config部分即可,OAuth2全局过滤器配置不需要改动:
route_config: name: local_route virtual_hosts: - name: my-service domains: - "*" routes: # 免认证路由放在最前,优先匹配 - match: prefix: "/api/v1/myResource1" route: cluster: my-service # 单路由层级配置过滤器规则,禁用当前路由的OAuth2校验 typed_per_filter_config: envoy.filters.http.oauth2: "@type": type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2 # 传入空配置即触发跳过逻辑,不需要填写其他认证参数 # 其余需要认证的路由正常配置 - match: prefix: "/api/v1/myResource2" route: cluster: my-service # 默认兜底路由,走全局认证 - match: prefix: "/" route: cluster: my-service
配置注意事项
- 所有免认证路由必须放在需要认证的路由、通配兜底路由之前,否则会被靠前的匹配规则拦截,免认证配置不生效。
- OAuth2过滤器内置已经默认放行
/oidc/callback、/oidc/signout两个回调/登出路径,不需要额外给这两个路径加免认证规则,否则会导致认证流程死循环。 - 不要在Virtual Host层级配置OAuth2的per_filter_config,当前所有稳定版Envoy的OAuth2过滤器均未开放该层级的配置能力。
效果验证
配置加载完成后可直接验证:
- 访问免认证路径
/api/v1/myResource1时,不会返回302重定向到OIDC服务地址,会直接透传请求到后端服务返回响应。 - 访问其余未配置免认证规则的路径时,会正常返回302跳转至OIDC认证页面,原有认证流程不受影响。
内容的提问来源于stack exchange,提问作者Jean-Philippe
相关产品推荐
相关产品推荐

