【发布时间】:2018-04-12 08:29:49
【问题描述】:
我在同一台服务器上运行了三个具有不同路径的 Spring Boot 应用程序。它们三个都暴露了 API 端点,其中一个还提供 Web 资源,例如 HTML、JavaScript 和 CSS。
应用 1:
- 提供 UI 文件
- 提供 API 端点
应用 2
- 提供 API 端点
应用程序 3
- 提供 API 端点
到目前为止,我们只为应用程序 1 启用了 CSRF 验证。它与 org.springframework.security.web.csrf.CookieCsrfTokenRepository 配合得很好。我们将XSRF-TOKEN 作为cookie 发送,而angularJs 在每个请求的标头中发回X-XSRF-TOKEN。
现在我们计划将XSRF 引入其他两个应用程序,就像我们对应用程序 1 所做的那样。
但是我们遇到了一个问题。 AngularJs 从应用程序 1 发送 XSRF-TOKEN 并为所有三个应用程序使用相同的令牌,而每个应用程序每个(应用程序路径)都有自己的 TOKEN cookie。
这会导致其他两个服务的CSRF 验证失败。
这是我使用的配置。
Spring-boot version : 1.5.3
Angular version : 1.3.18
<beans:bean id="csrfTokenRepository" class="org.springframework.security.web.csrf.CookieCsrfTokenRepository">
<beans:property name="cookieHttpOnly" value="false" />
</beans:bean>
我得到的错误
{
"timestamp": 1509437659613,
"status": 403,
"error": "Forbidden",
"message": "Invalid CSRF Token '2fa60cb2-803f-4b2b-a1d6-7e10e56ca649' was found on the request parameter '_csrf' or header 'X-XSRF-TOKEN'.",
"path": "/application2/posturl/path"
}
这里的令牌 2fa60cb2-803f-4b2b-a1d6-7e10e56ca649 来自 application1,cookie 路径为 /application1。
到目前为止我的观察:
- 我检查并确保所有三个应用程序都在设置 cookie
成为
httpOnly=false。 - 我可以看到所有三个应用程序都有
他们自己的
XSRF-TOKENcookie 在 chrome 开发者控制台中使用 他们自己的道路。 - 我没有在角端写一行 更改其默认行为。
- 所有三个应用程序都作为 WAR 文件在相同的 IP 和端口上运行。
我在这里怀疑的是 Angular 不尊重路径 cookie 的属性,它与第一个带有名称的 cookie 一起使用
XSRF-TOKEN.
有没有办法解决这个问题?
【问题讨论】:
-
如果您需要更多详细信息,请告诉我。
标签: javascript java angularjs spring cookies