我们正在开发Web应用程序,该应用程序由部署在GKE上的一系列BFF服务支持,Istio配置为作为Sidecar注入BFF服务中的每个Pod。
这里的要求是
- 对所有工作负载实施基于JWT的身份验证,除了spring执行器端点。
- 从JWT声明中提取member_id,并将其作为头传递给服务。
- 我想绕过这个“内部”端点(从网络内),当BFF的内部交谈**(这是我卡住了)**
这是我目前为止的工作。
- 设置RequestAuthentication如下
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: req-auth-jwt-required
namespace: istio-testing-ns
spec:
selector:
matchLabels:
app: istio-testing-service
jwtRules:
- issuer: "https://abc.us.com/"
jwksUri: https://abc.us.com/.well-known/jwks.json
outputClaimToHeaders:
- header: X-MemberId
claim: x-member-id
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: req-auth-policy-authenticated-only
namespace: istio-testing-ns
spec:
selector:
matchLabels:
app: istio-testing-service
action: DENY
rules:
- from:
- source:
notRequestPrincipals: ["*"]
to:
- operation:
notPaths: ["/istio-test/service/v1/actuator*"]
notHosts: ["internal-*"]
methods:
- "GET"
- to:
- operation:
paths:
- "/istio-test/service/v1/categories*"
notHosts: ["internal-*"]
methods:
- "GET"
- "POST"
when:
- key: request.auth.claims[x-permissions]
notValues:
- "categories-lookup"
所以,使用这两个清单我试图满足上述要求,它是,到目前为止工作,然而,问题,我遇到的是下面
- 当使用“内部”主机调用服务时,没有JWT和头X-RenderId,
outputClaimToHeaders
似乎覆盖了头,因此服务失败。
我应该如何去满足这个或任何其他一般性建议的任何建议?
1条答案
按热度按时间ldioqlga1#
我相信这可能是一个可能的bug,如果JWT没有通过,头文件就会被删除。
因此,我使用以下方法来解决我的问题。
在Istio中,我使用
outputPayloadToHeader
将经过验证的JWT的有效负载作为头部传递给服务。完成上述工作后,我用
ClaimExtractingFilter
编写了一个过滤器,它基本上提取传入的头(X-JWT-Payload),提取声明并将它们作为头传递给实际的服务。让我知道,如果有人需要更多的细节过滤器,我会很乐意提供。