【发布时间】:2019-12-23 16:16:00
【问题描述】:
在调用资源服务器后,Spring Cloud Gateway 重置 SESSION cookie 时遇到问题。
我有一个 Angular 应用程序、一个 Spring Cloud Gateway 应用程序、一个外部授权服务器和一个我自己的资源服务器。
Angular 应用程序首先通过 Spring Cloud Gateway 应用程序进行授权(该应用程序使用 OAuth2 将这项工作委托给外部授权服务器)并接收SESSION cookie。此时用户已通过身份验证,Authentication 对象在 Spring Cloud Gateway 应用程序中可用。
接下来,Angular 应用程序调用 Spring Cloud Gateway 应用程序的端点,该端点实际上将调用转发到资源服务器(并在调用中包含 Bearer 令牌,因此调用正常),资源服务器返回一些结果,它通过 Spring Cloud Gateway 应用程序成功发送回 Angular 应用程序。但是除了成功响应之外,Spring Cloud Gateway 应用程序还会发送此标头:
set-cookie: SESSION=; Max-Age=0; Expires=Sat, 17 Aug 2019 20:39:44 GMT; Path=/; HTTPOnly
即使Authentication 对象仍然存在并且会话看起来也很好,这会杀死客户端的 cookie 并使后续调用变得不可能。
有谁知道这种行为的原因是什么?
【问题讨论】:
-
网关根本不创建cookie,其他的是:下游应用程序或spring security或其他,但它不是网关。
-
@spencergibb 对不起,我可能不够清楚。我想说的是使用
Spring Cloud Gateway将调用从 Angular 应用程序转发到资源服务器的应用程序正在使用 Spring Reactive Security 和 OAuth2 与外部身份验证服务器,但由于某种原因,一旦请求被转发到任何资源,cookie 就会失效服务器。我已经通过实现删除标头的GlobalFilter来解决它,但想知道 cookie 被删除的原因是什么,或者至少得到一个线索 what 可能正在设置标头跨度> -
在遇到同样的问题后,我发现在
ServerHttpSecurity中禁用requestCache解决了这个问题,并且网关不再删除SESSIONcookie。我真的不知道为什么。 -
如何禁用 requestCache?
http.requestCache.disable()无效。 -
@horatius 请看我提供的答案:stackoverflow.com/a/66444832/2578324
标签: session cookies session-cookies spring-cloud spring-cloud-gateway