从spring boot调用安全Rest api

从spring boot调用安全Rest api,spring,spring-boot,spring-security,spring-resttemplate,Spring,Spring Boot,Spring Security,Spring Resttemplate,我有一个spring启动应用程序,需要调用一个安全的外部api来检索数据 以下是我遵循的步骤: 我使用用户名和密码生成令牌 我将令牌保存在一个临时变量中 我在每次调用resttemplate时都使用它 headers.add("Authorization", "Bearer " + token); 添加(“授权”、“承载人”+令牌); 我的问题是: 保存生成的令牌并为每个连接的用户使用它的最佳方法是什么 我们可以配置spring安全性来管理对外部api的调用吗 正如我所想,您需要代理一个

我有一个spring启动应用程序,需要调用一个安全的外部api来检索数据

以下是我遵循的步骤:

  • 我使用用户名和密码生成令牌

  • 我将令牌保存在一个临时变量中

  • 我在每次调用resttemplate时都使用它

    headers.add("Authorization", "Bearer " + token); 添加(“授权”、“承载人”+令牌);
  • 我的问题是:

    • 保存生成的令牌并为每个连接的用户使用它的最佳方法是什么
    • 我们可以配置spring安全性来管理对外部api的调用吗

    正如我所想,您需要代理一个安全的rest api,并响应您自己的用户。 但是安全api需要身份验证,并且您希望每个用户都有一个特定的jwt。 您有两种实现方法:

    1-使用像Redis这样的内存内令牌存储,启用持久化模式以确保可靠性和可扩展性。按照以下步骤操作:[对于每个用户,检查令牌是否已经生成并存储在存储器中]->[如果是,则获取令牌并将其分配到restTemplate请求的标头]->[如果不是,则从安全api获取令牌并将其存储,然后从第一步开始重新启动]

    提示:您可以通过会话或oauth识别每个用户]

    2-以前的解决方案不是最佳做法,因为您应该有内存存储,这将是您的瓶颈。(您应该对其进行集群,并垂直增加资源)。 因此,下一个解决方案是在客户端为每个用户存储令牌。您应该遵循以下步骤:[如果您自己的用户将令牌发送给您的rest api,您应该捕获它,验证它,并使用restTemplate转发到安全api]->[否则,这意味着您尚未将令牌发送给用户,因此您应该获取令牌并对其进行响应]

    提示:您应该退出安全算法从安全api获取的jwt令牌,因为该令牌被发送到客户端,并且令牌的内容可能有一些漏洞


    第二种解决方案是忘记内存中的db及其IO/bound。但它在jwt令牌上添加了cpu绑定的进程。每个用户都将其令牌存储在浏览器中,您可以使用该令牌来标识您的用户,而不是使用会话或类似的方式。因此,我强烈建议您阅读签名算法,如sha(2565121024)或其他类型的ALG。

    正如我所想,您需要代理一个安全的rest api并响应您自己的用户。 但是安全api需要身份验证,并且您希望每个用户都有一个特定的jwt。 您有两种实现方法:

    1-使用像Redis这样的内存内令牌存储,启用持久化模式以确保可靠性和可扩展性。按照以下步骤操作:[对于每个用户,检查令牌是否已经生成并存储在存储器中]->[如果是,则获取令牌并将其分配到restTemplate请求的标头]->[如果不是,则从安全api获取令牌并将其存储,然后从第一步开始重新启动]

    提示:您可以通过会话或oauth识别每个用户]

    2-以前的解决方案不是最佳做法,因为您应该有内存存储,这将是您的瓶颈。(您应该对其进行集群,并垂直增加资源)。 因此,下一个解决方案是在客户端为每个用户存储令牌。您应该遵循以下步骤:[如果您自己的用户将令牌发送给您的rest api,您应该捕获它,验证它,并使用restTemplate转发到安全api]->[否则,这意味着您尚未将令牌发送给用户,因此您应该获取令牌并对其进行响应]

    提示:您应该退出安全算法从安全api获取的jwt令牌,因为该令牌被发送到客户端,并且令牌的内容可能有一些漏洞

    第二种解决方案是忘记内存中的db及其IO/bound。但它在jwt令牌上添加了cpu绑定的进程。每个用户都将其令牌存储在浏览器中,您可以使用该令牌来标识您的用户,而不是使用会话或类似的方式。因此,我强烈建议您阅读签名算法,如sha(2565121024)或其他类型的ALG