我们正在开发 Web 应用程序,该应用程序由部署在 GKE 上的一组 BFF 服务支持,并将 Istio 配置为作为 sidecar 注入 BFF 服务中的每个 pod 上。
这里的要求是
这是我迄今为止所做的工作。
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"
所以,使用这两个清单,我试图满足上述要求,到目前为止,它是有效的,但是,我遇到的问题如下
outputClaimToHeaders
似乎覆盖了标头,因此服务失败。关于我应该如何满足这个要求或任何其他一般性建议有什么建议吗?
我相信这可能是一个可能的错误,如果 JWT 未通过,标头会被擦除。
因此,我使用以下方法来解决我的问题。
在 Istio 中,我使用
outputPayloadToHeader
将经过验证的 JWT 有效负载作为标头传递给服务。
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
outputPayloadToHeader: "X-JWT-Payload"
完成上述操作后,我在
ClaimExtractingFilter
中编写了一个过滤器,基本上,提取传入的标头(X-JWT-Payload)并提取声明并将它们作为标头传递给实际服务。
如果有人需要有关过滤器的更多详细信息,请告诉我,我很乐意提供。