我有两个Spring Boot REST应用程序。其中一个应用程序使用Spring RestTemplate
调用其他应用程序。让我们调用这些应用程序服务器和客户端应用程序。
服务器应用程序正在发送XSRF-TOKEN
令牌作为cookie,这是针对UI部分完成的。然而,服务器无法区分来自浏览器的请求和来自客户端应用程序的请求,因此无法(我知道)。因此,我无法选择性地将CSRF
令牌从服务器发送到浏览器。
Spring中是否有内置机制允许RestTemplate检测CSRF cookie / header并重播请求?
如果不能,我怎样才能手动完成相同操作?我是否应该等待CSRF异常发生,然后从响应中读取cookie并重放它?
如果要完成一次,那就没关系,但是等待每个RestTemplate
调用的异常似乎不对。
我可能会尝试将令牌存储一次并从下次开始设置,但是它将如何处理多服务器应用场景(我必须在下一步实现)。由于一个服务器应用程序的CSRF
令牌对另一个服务器应用程序无效,因此我将无法存储单个令牌,但我必须存储令牌地图,这些令牌将为每个新服务器提供一个条目应用网址。
这一切看起来都太复杂了,我宁愿让Spring处理它。
感谢任何线索。
由于
答案 0 :(得分:0)
现在我已经在服务器应用程序中实现了一个没有保护的REST服务,可以调用它来获取CSRF cookie。我必须始终允许创建会话,以便CSRF cookie在一个会话中不会更改,以便我可以避免错误Could not verify the provided CSRF token because your session was not found
。
客户端应用程序调用CSRF休息服务来获取cookie,然后通过下一次服务调用发送它。
通过RestTemplate
为每个REST调用调用CSRF令牌服务似乎很多,但它使我无法实现存储会话的复杂逻辑。 CSRF令牌服务只提供cookie,因此与实际服务呼叫相比,它的网络呼叫不会花费太多时间。
我还在考虑使用持久存储(SQL数据库或Redis)来存储服务器应用程序的CSRF令牌,然后让客户端应用程序直接从持久存储中读取它。
但是,我无法弄清楚如何将Session + Server app + CSRF token
关联在一起以识别客户端所需的令牌。由于客户端最初没有会话,因此无法从数据库中为其令牌唯一地查找CSRF令牌。由于RestTemplate
不存储下次调用的会话,因此该方法更加复杂。