服务器上的JWT登录流程和令牌验证

时间:2016-02-27 06:04:51

标签: java angularjs rest jax-rs jwt

在服务器上验证令牌的正确方法是什么?

我在我的应用程序中使用jwt令牌机制,现在它的工作方式如下:

  1. 客户端使用用户名和密码登录
  2. 服务器检查用户名和密码,并使用RSA创建令牌 公钥和私钥,并使用有效负载向客户端发送新令牌 包含用户的电子邮件地址,然后存储相同的令牌 数据库中。
  3. 服务器上的任何后续资源请求,客户端发送 然后,jwt令牌服务器使用可用的令牌检查令牌 数据库基于用户登录的电子邮件地址。
  4. 然后将资源提供给客户。
  5. 我想我在这里遗漏了一些东西。阅读其他博客文章,我看到该标记应该用密钥验证。

    我有几个问题:

    1. 我不确定是否应该根据公钥检查令牌 私钥
    2. 在向客户端发送jwt令牌时,我必须发送公钥 客户端在有效负载中,因为我正在使用RSA机制?所以对于每个请求 对于资源,我必须解码令牌并检查公钥 反对私钥?
    3. 在哪些情况下,我需要在数据库中存储令牌?或者是 根本不需要在数据库中存储令牌?
    4. 当恶意在客户端获取令牌时会发生什么 并用它来登录?
    5. 注意:我使用vanilla java和jax-rs(rest)作为后端,使用angularjs作为前端。感谢

1 个答案:

答案 0 :(得分:0)

  1. 服务器必须使用私钥对JWT进行签名。然后,客户端可以在收到令牌时使用公钥以及服务器本身对其进行验证。
  2. 在发送令牌之前,客户端必须知道公钥。
  3. 自JWT签名以来,您无需在数据库中存储访问令牌。您只需使用签名进行验证即可。如果令牌是使用任何其他私钥生成的,则无法使用您的公钥进行验证。
  4. 攻击者无法使用访问令牌登录。如果存在恶意获取令牌的风险,则必须为令牌设置较短的到期时间,并使用refresh token获取新令牌。刷新令牌应该保留在服务器端。如果刷新令牌被泄露,则可以使其无效(用户应该能够撤销对该客户端的访问)。或者,您可以向JWT注入安全随机数,并将该号码存储在服务器端,以防止用户。当用户发送令牌时,您必须在JWT中对数据库中的安全随机数进行验证。然后,您可以通过更改数据库中的安全随机数使令牌无效。