发布社区 wiki 答案以获得更好的可见性。随意扩展它。
目前,在 Isito 中使用RequestAuthentication
. Istio 论坛上有一个主题与一个非常相似的问题 - Setting request headers with values from a JWT , last pinged 10 days ago (state for 03.12.2021) - 你可以考虑订阅它。
还有一个不错的文档 -将 JWT 声明复制到标题中,通过来自不同网站的建议和可能的解决方案/解决方法总结了这个问题:
有几种现有的解决方案和解决方法
- 解决方案 1:WASM 过滤器 - 开发了一个专用的 WASM 过滤器,用于将声明复制到标头,作为 ASM 客户的解决方法。- 该解决方案需要部署和配置专用的 WASM 过滤器,采用过程有点繁重,由于使用 EnvoyFIlter API,可能不适合所有 ASM 客户。- 在现有的基于 WASM 的解决方案附录中查看更多详细信息。
- 解决方案 2:Lua 过滤器 - OSS 社区开发了一些示例 lua 过滤器配置,用于将声明复制到标头。- 这个解决方案非常轻量级,因为它只使用上游 Envoy 中的原生内置 Lua 过滤器。配置很简单,并且具有很大的灵活性,因为它只是一些 lua 代码。这个解决方案仍然需要使用 EnvoyFilter API,并且 ASM 也不支持 Lua 过滤器。- 在讨论,istio.io线程中查看更多详细信息。
- 解决方案 3:在 VirtualService 中重用未记录的功能 - 此解决方案是在此设计中开发的,以重用虚拟服务中的未记录功能,以将动态元数据(JWT 声明)复制到 HTTP 标头。- 这可能是最轻量级的解决方案,因为它只需要一流的 Istio 虚拟服务 API。- 此解决方案存在一些限制,例如该功能未记录并直接使用 Envoy 日志记录格式,该功能也受到限制,可能不支持对 HTTP 标头和字符串以外的类型声明进行适当的清理。- 以下是将“group”声明复制到“x-istio-jwt-group”标头的示例虚拟服务:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
- reviews.prod.svc.cluster.local
http:
- headers:
request:
set:
x-istio-jwt-group:
'%DYNAMIC_METADATA(["istio_authn", "request.auth.claims", "group"])%'
route: <...>
查看这篇文章 - Istio Request Control with Envoy Filters - Request Headers - 有点过时但有很好的解释。在 GitHub 页面上查看上述解决方案的更新代码。
另一种解决方法是更改您的应用程序以从标头读取转发的 JWT 有效负载并从此处获取值。您必须设置outputPayloadToHeader
字段:
此字段指定标头名称以将成功验证的 JWT 有效负载输出到后端。转发的数据是 base64_encoded(jwt_payload_in_JSON)
。如果未指定,则不会发出有效负载。
请记住,您也可以使用以下字段将原始令牌转发到您的应用程序forwardOriginalToken: true
:
如果设置为 true,将为上游请求保留原始令牌。默认为假。