如何使用 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
不存储下一次调用的会话,因此此方法更加复杂。
我有两个 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
不存储下一次调用的会话,因此此方法更加复杂。