如何使用 RestTemplate 传递 CSRF 令牌

How to pass CSRF token with the RestTemplate

我有两个 Spring Boot REST 应用程序。其中一个应用程序使用 Spring RestTemplate 调用其他应用程序。让我们将这些应用程序称为服务器和客户端应用程序。

服务器应用正在发送 XSRF-TOKEN 令牌作为 cookie,这是针对 UI 部分完成的。但是,服务器无法(据我所知 None)区分来自浏览器的请求和来自客户端应用程序的请求。所以我不能选择性地将 CSRF 令牌从服务器发送到浏览器。

Spring 中是否有内置机制允许 RestTemplate 检测 CSRF cookie/header 并重放请求?

如果不能,我该如何手动执行相同的操作?我应该等待 CSRF 异常发生,然后从响应中读取 cookie 并重播吗?

如果只执行一次就可以了,但是等待每个 RestTemplate 调用的异常似乎不对。

我可能会尝试将令牌存储一次并从下次开始设置,但是它如何处理多服务器应用程序场景(我接下来必须实现)。由于一个服务器应用程序的 CSRF 令牌对另一个服务器应用程序无效,因此我将无法存储单个令牌,但我必须存储一个令牌映射,每个新服务器都有一个条目应用 URL.

这一切似乎太复杂了,我宁愿Spring处理它。

如有任何线索,我们将不胜感激。

谢谢

目前我已经在服务器应用程序中实现了一个没有保护的 REST 服务,可以调用它来获取 CSRF cookie。我必须始终允许创建会话,这样 CSRF cookie 就不会在一个会话中更改,这样我就可以避免错误 Could not verify the provided CSRF token because your session was not found.

客户端应用程序调用 CSRF rest 服务来获取 cookie,然后在下一个服务调用中发送它。

通过 RestTemplate 为每个 REST 调用调用 CSRF 令牌服务似乎很多,但是它使我免于实现存储会话的复杂逻辑。 CSRF 令牌服务仅提供 cookie,因此与实际服务调用相比,它的网络调用不会花费太多时间。

我也在考虑使用持久存储(SQL数据库或Redis)来存储服务器应用程序的CSRF令牌,然后让客户端应用程序直接从持久存储中读取它。

但是我不知道如何将 Session + Server app + CSRF token 关联在一起以识别客户端所需的令牌。由于客户端最初没有会话,因此它无法从数据库中唯一地找到它的令牌的 CSRF 令牌。由于 RestTemplate 不存储下一次调用的会话,因此此方法更加复杂。