1

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

在下面我遵循的步骤:

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

  2. 我将令牌保存在临时变量中

  3. 我在每个 resttemplate 调用中使用它

    headers.add("授权", "承载" + token);

我的问题是:

  • 保留生成的令牌并将其用于每个连接的用户的最佳方法是什么?
  • 我们可以配置 spring security 来管理对外部 api 的调用吗?
4

1 回答 1

0

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

1- 使用像 Redis 这样的内存令牌存储,启用持久性模式以实现可靠和可扩展。请按照以下步骤操作:[为每个用户检查令牌是否已生成并存储在存储中] -> [如果是,则获取并将其分配给 restTemplate 请求的标头] -> [如果没有从 secure-api 获取令牌并存储它并从第一步开始重新开始]

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

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

提示:你应该放弃你的安全算法从secure-api获取的jwt-token,因为token被发送到客户端并且token的内容可能有一些漏洞

第二种解决方案是忘记 In-Memory db,它的 IO/bound 增加了延迟。但它会在您的 jwt 令牌上添加一个 CPU 绑定进程。每个用户都将其令牌存储在浏览器中,您可以使用令牌来识别您的用户,而不是使用会话或类似的东西。因此,我强烈建议您阅读有关签名算法的信息,例如 sha(256,512,1024) 或其他一些类型的算法。

于 2020-12-14T11:10:35.197 回答