我有两个Spring应用程序。其中一个应用程序使用Spring RestTemplate
调用其他应用程序。让我们调用这些应用服务器和客户端应用程序。
服务器应用程序将XSRF-TOKEN
令牌作为cookie发送,这是为UI部分完成的。但是,服务器没有办法(据我所知)区分来自浏览器的请求和来自客户端应用程序的请求。因此,我不能选择性地将CSRF
令牌从服务器发送到浏览器。
在Spring中是否有内置机制,允许RestTemplate检测cookie/头并重放请求?
如果不是的话,我怎么能手动做同样的事情呢?我是否应该等待CSRF异常发生,然后从响应中读取cookie并重新播放它?
如果只执行一次,那么就可以了,但是等待每个RestTemplate
调用的异常似乎是不对的。
我可能尝试存储一次令牌,并从下一次开始设置,但是它将如何处理多服务器应用场景(这是我必须实现的下一步)。由于一个服务器应用程序的CSRF
令牌对另一个服务器应用程序无效,所以我无法存储单个令牌,但我必须存储一个令牌映射,它将为每个新的服务器应用程序URL提供一个条目。
这一切似乎太复杂了,我宁愿让Spring来处理。
任何线索都很感激。
谢谢
发布于 2017-08-25 11:53:00
目前,我已经在服务器应用程序中实现了一个没有保护的REST服务,可以调用它来获取cookies。我必须始终允许创建会话,以便cookie不会在一个会话中更改,这样我就可以避免错误Could not verify the provided CSRF token because your session was not found
。
客户端应用程序调用CSRF服务来获取cookie,然后将其与下一个服务调用一起发送。
似乎可以通过RestTemplate
为每个REST调用CSRF令牌服务,但是它可以帮助我避免实现存储会话的复杂逻辑。CSRF令牌服务只交付cookie,因此与实际的服务调用相比,它的网络调用不需要花费太多时间。
我还考虑使用持久存储( storage或Redis)来存储服务器应用程序的CSRF令牌,然后让客户端应用程序直接从持久存储中读取它。
但是,我不知道如何将Session + Server app + CSRF token
关联到一起来识别客户端所需的令牌。由于客户端最初没有会话,所以它无法从数据库中唯一地为它的令牌找到CSRF令牌。由于RestTemplate
不为下一次调用存储会话,这个方法更加复杂。
https://stackoverflow.com/questions/45865005
复制相似问题