【问题标题】:Implementing a JWT Auth Service实现 JWT 身份验证服务
【发布时间】:2020-05-11 03:05:47
【问题描述】:

我正在尝试实现 RSA JWT 身份验证服务。我已经关注了这里的其他帖子,但我不确定我创建的服务是否真正安全。

让我列出流程:

  1. 客户端点击身份验证服务并通过身份验证
  2. 创建 RSA 公钥/私钥。
  3. 使用私钥生成 JWT 签名。
  4. 使用 JWT 以及之前生成的公钥响应用户
  5. 客户持有 JWT
  6. 客户端在 HTTP Header 中将 JWT 和公钥发送到单独的受保护服务。
  7. 受保护的服务使用公钥解密 JWT

我的担忧是:

  1. 如果 HTTP 请求包含解密 JWT 所需的所有信息,那么这是否意味着任何人都可以使用它来访问受保护的服务?

  2. 我对 RSA 加密的理解是 2 方生成自己的公钥/私钥。他们交换公钥。一方使用对方的公钥进行加密,只能通过对应的私钥解密。这意味着只有正确的客户端才能读取信息。 在这种情况下不会发生这种情况

【问题讨论】:

    标签: java spring-boot authentication jwt


    【解决方案1】:

    在 JWT 中要明确一点,公钥允许您将令牌解密回数据,而私钥允许您解密和加密,即从数据生成 JWT。

    所以使用 JWT 的想法是您不需要每次都来自客户端的公钥/私钥。你把它们放在你的后端。一旦客户端通过身份验证,您只需将 JWT 提供给客户端。大多数时候,这个 JWT 存储在客户端的会话(或 cookie)中。然后,客户端每次都会通过需要身份验证的请求发送该 JWT。服务器拥有公钥/私钥来解密 JWT 并验证请求是否真实。

    这只是一个非常基本的工作,但我希望它有助于清除问题。

    【讨论】:

    • 谢谢。那里有很多优点。问题是后端没有公共/私有,因为这是一个分布式系统。即在 Authentication Service 中创建 JWT,然后我们将这个 JWT 在 Cookies 中发送给其他服务。因此这些其他服务需要传递密钥来解密 JWT
    • 因此您不需要在每个服务中使用这些密钥。您可以在身份验证服务中创建一个端点,该端点接受 JWT 作为参数并返回令牌验证的结果。这涉及服务到服务的通信,您可以使用任何通信(编排或编排)手段来促进这一点。您的所有服务都可以利用您的身份验证服务来执行此类任务。
    • 抱歉,这个答案有帮助吗?
    猜你喜欢
    • 2015-01-21
    • 2021-08-13
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2017-12-23
    • 2019-09-23
    • 2016-04-19
    相关资源
    最近更新 更多