背景
我想要实现这篇文章中提出的设计。
- 客户端首先通过IDP(OpenID Connect/OAuth2)进行身份验证
- IDP返回访问令牌(不带用户信息的不透明令牌)
- 客户端使用Authorization标头中的访问令牌通过API网关进行调用
- API网关使用Access Token向IDP发出请求
- IDP验证Access Token是否有效,并以JSON格式返回用户信息
- API网关将用户信息存储在JWT中,并使用私钥对其进行签名。然后将JWT传递给验证JWT使用公钥的下游服务
- 如果服务必须调用另一个服务来满足请求,则将JWT一起传递,该JWT用作请求的身份验证和授权
目前进展
我已经使用以下内容完成了大部分工作:
- Spring cloud 作为全局框架
- Spring boot 用于启动单个服务
- Netflix Zuul 作为API网关
我还编写了一个Zuul PRE过滤器,用于检查Access Token、联系IDP并创建JWT。然后将JWT添加到转发给下游服务的请求标头中。
问题
现在我的问题非常特定于Zuul及其过滤器。如果由于任何原因API网关中的身份验证失败,如何可以停止路由并直接响应401,而不继续过滤器链和转发调用?
目前,如果身份验证失败,则过滤器将不会将JWT添加到标头中,并且401将来自下游服务。我希望我的网关可以防止这种不必要的调用。
我试图使用com.netflix.zuul.context.RequestContext
来实现这个目标,但是文档相当贫乏,我找不到方法。