在验证之前使用JWT有效载荷

时间:2018-02-28 15:43:48

标签: jwt

我将JWT集成到我的服务中,将由移动客户端使用。想法是在有效载荷中包括用户id并使用用户在客户端上的私钥登录。然后,在服务端,提取用户ID并使用公钥验证签名。根据在验证JWT有效载荷之前如何提取JWT有效载荷的问题数量,似乎有不少人这样做了。但另一方面,经常有人说,在您信任JWT中的任何信息之前,始终要验证签名。

实施此方法的正确方法是什么?我应该在用户名中包含用户ID和签名,然后使用客户端私钥对其进行签名吗?

3 个答案:

答案 0 :(得分:2)

使用非对称RSA私钥/公钥算法,应该在访问有效负载之前验证令牌。使用发布密钥,您既可以验证令牌也可以解码有效载荷:

  1. 客户端通过POST请求向服务发送用户凭据{ email: "test@mail.com", password:"secret" }
  2. 如果凭据匹配,请使用私有密钥对JWT令牌进行签名,以创建令牌并将user_id添加到有效负载中。
  

您的服务器或身份验证服务应持有私钥。   您的客户。

  1. 将JWT令牌作为响应发送回客户端。
  2. 客户使用公钥来验证和解码您的令牌。
  3. 访问您的有效载荷声明(user_id)。

使用对称HMAC对于单键验证(默认算法),您可以在客户端中从base64解码有效负载,而无需在客户端中验证令牌:

  1. 客户端通过POST请求向服务发送用户凭据{ email: "test@mail.com", password:"secret" }
  2. 如果凭据匹配,请用JWT secret对JWT令牌进行签名以创建令牌并将user_id添加到有效负载。
  3. 将JWT令牌作为响应发送回客户端。
  4. 从base64解码您的有效负载并在客户端访问您的声明(user_id)。

答案 1 :(得分:1)

JWT身份验证通常用于两阶段身份验证逻辑。 首先,您通过SSL在基本身份验证请求中提供您的用户ID和密码。 如果服务验证,服务会创建 JWT访问令牌并将其发送回客户端。 其次,客户端可以使用此JWT进行身份验证(通过SSL),直到其生命周期持续。 没有必要使用非对称方法为有效负载签名。您可以更快地使用对称密钥,因为您不必在客户端上解密它。

您可以找到更多详情,例如在this网站上。

答案 2 :(得分:1)

您的身份验证过程绝对有效。需要从有效负载中提取userid声明以定位匹配的公钥。只有在验证签名后,您才能信任"发行人。

在网站的常规身份验证方案中(例如使用username / pwd登录),服务器使用唯一的密钥发出令牌,因此服务器无需检查有效负载以选择验证密钥。但是当私钥由客户拥有时,在移动设备的情况下,每个jwt都有不同的签名密钥,因此您的验证过程与通常的不一样