我将JWT集成到我的服务中,将由移动客户端使用。想法是在有效载荷中包括用户id并使用用户在客户端上的私钥登录。然后,在服务端,提取用户ID并使用公钥验证签名。根据在验证JWT有效载荷之前如何提取JWT有效载荷的问题数量,似乎有不少人这样做了。但另一方面,经常有人说,在您信任JWT中的任何信息之前,始终要验证签名。
实施此方法的正确方法是什么?我应该在用户名中包含用户ID和签名,然后使用客户端私钥对其进行签名吗?
答案 0 :(得分:2)
使用非对称RSA
私钥/公钥算法,应该在访问有效负载之前验证令牌。使用发布密钥,您既可以验证令牌也可以解码有效载荷:
{ email: "test@mail.com", password:"secret" }
您的服务器或身份验证服务应持有私钥。 不 您的客户。
使用对称HMAC
对于单键验证(默认算法),您可以在客户端中从base64解码有效负载,而无需在客户端中验证令牌:
{ email: "test@mail.com", password:"secret" }
JWT secret
对JWT令牌进行签名以创建令牌并将user_id添加到有效负载。 答案 1 :(得分:1)
JWT身份验证通常用于两阶段身份验证逻辑。 首先,您通过SSL在基本身份验证请求中提供您的用户ID和密码。 如果服务验证,服务会创建 JWT访问令牌并将其发送回客户端。 其次,客户端可以使用此JWT进行身份验证(通过SSL),直到其生命周期持续。 没有必要使用非对称方法为有效负载签名。您可以更快地使用对称密钥,因为您不必在客户端上解密它。
您可以找到更多详情,例如在this网站上。
答案 2 :(得分:1)
您的身份验证过程绝对有效。需要从有效负载中提取userid声明以定位匹配的公钥。只有在验证签名后,您才能信任"发行人。
在网站的常规身份验证方案中(例如使用username / pwd登录),服务器使用唯一的密钥发出令牌,因此服务器无需检查有效负载以选择验证密钥。但是当私钥由客户拥有时,在移动设备的情况下,每个jwt都有不同的签名密钥,因此您的验证过程与通常的不一样