2016-02-27 126 views
4

在服务器上验证令牌的正确方法是什么?服务器上的JWT登录流和令牌验证

我用我的应用程序JWT令牌机制和这里的如何了其作为现在工作:

  1. 客户端登录用户名和密码
  2. Server检查用户名和密码,并与RSA 创建令牌公钥和私钥,并向客户端发送一个新的令牌,其中包含用户电子邮件地址的有效负载 ,然后在 数据库中存储相同的令牌。
  3. 任何后续的服务器,客户端上的资源请求沿着 jwt令牌发送服务器然后根据用户使用登录的电子邮件地址检查具有 数据库中可用令牌的令牌。
  4. 然后提供资源给客户端。

我想我在这里失去了一些东西。阅读其他博客帖子,我发现应该使用密钥验证令牌。

几个问题,我有:

  1. 我不知道是否令牌应该对公共密钥或 私人检查关键
  2. 当发送JWT令牌的客户我必须公钥发送给 客户端在有效载荷中,因为我使用的是RSA机制?因此,对于资源的每个请求 ,我必须解码令牌并检查公钥 对私钥?
  3. 在哪些场景中,我需要将令牌存储在数据库中?或者根本不需要在数据库中存储令牌 ?
  4. 当恶意获取客户端上的令牌 并将其用于登录时会发生什么?

注意:我使用的是前端的后端和angularjs的vanilla java和jax-rs(rest)。谢谢

回答

0
  1. 服务器必须使用私钥在JWT上签名。然后客户端可以在收到令牌时使用公钥和服务器自身进行验证。
  2. 发送令牌之前,客户端必须知道公钥。
  3. 由于JWT已签名,您不需要将访问令牌存储在数据库中。你可以用签名来验证它。如果令牌是使用任何其他私钥生成的,则不能使用您的公钥进行验证。
  4. 攻击者不应该能够使用访问令牌登录。如果存在恶意获取令牌的风险,则必须为该令牌设置一个短期到期期限,并使用refresh token来获取新令牌。刷新令牌应该保留在服务器端。如果刷新令牌被破坏,它可以失效(用户应该能够撤消对该客户端的访问)。或者,您可以向JWT注入一个安全的随机数字,并将该数字存储在服​​务器端,以对用户进行处理。当用户发送令牌时,您必须根据数据库中的验证JWT中的安全随机数。然后,您可以通过更改数据库中的安全随机数来使标记无效。