验证前使用JWT有效载荷

验证前使用JWT有效载荷,jwt,Jwt,我正在将JWT集成到我的服务中,移动客户端将使用它。其思想是在有效负载中包含用户id,并在客户端上使用用户的私钥登录。然后,在服务端,提取用户id并使用公钥验证签名。似乎有相当多的人这样做,这是基于在验证之前如何提取JWT负载的问题。但另一方面,通常会说“在信任JWT中的任何信息之前,始终要验证签名” 正确的方法是什么?我是否应该将用户id和签名包含到有效负载中,然后使用客户端私钥对其进行签名?JWT身份验证通常在两阶段身份验证逻辑中使用。 首先,通过SSL在基本身份验证请求中提供用户id和密码

我正在将JWT集成到我的服务中,移动客户端将使用它。其思想是在有效负载中包含用户id,并在客户端上使用用户的私钥登录。然后,在服务端,提取用户id并使用公钥验证签名。似乎有相当多的人这样做,这是基于在验证之前如何提取JWT负载的问题。但另一方面,通常会说“在信任JWT中的任何信息之前,始终要验证签名”


正确的方法是什么?我是否应该将用户id和签名包含到有效负载中,然后使用客户端私钥对其进行签名?

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


您可以在网站上找到更多详细信息。

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


在通常的网站身份验证方案(例如使用用户名/pwd登录)中,令牌由服务器使用唯一的密钥颁发,因此服务器不需要检查有效负载来选择验证密钥。但是,当私钥由客户端拥有时,在移动设备的情况下,每个jwt都有不同的签名密钥,因此您的验证过程与通常的验证过程不同,使用非对称的RSA私钥/公钥算法,您应该在访问负载之前验证您的令牌。使用pub密钥,您可以验证令牌并解码有效负载:

  • 客户端发送用户凭据<代码>{电子邮件:test@mail.com,密码:“secret”}通过邮寄服务请求
  • 如果凭据匹配,请使用私钥签名JWT令牌以创建令牌并将用户id添加到有效负载 应该持有私钥的服务器或身份验证服务 您的客户。

  • 将JWT令牌作为响应发送回客户端
  • 客户端使用公钥验证和解码您的令牌
  • 访问您的有效负载声明(用户id)
  • 使用对称
    HMAC
    进行单密钥验证(默认算法),您可以在客户端解码base64中的有效负载,而无需在客户端验证令牌:

  • 客户端发送用户凭据<代码>{电子邮件:test@mail.com,密码:“secret”}通过邮寄服务请求
  • 如果凭据匹配,请使用
    JWT secret
    为JWT令牌签名,以创建令牌并将用户id添加到有效负载
  • 将JWT令牌作为响应发送回客户端
  • 从base64解码您的有效负载,并在客户端访问您的声明(用户id)