javascript - 客户端和服务器之间需要多少通信才能进行 JWT 验证?
问题描述
我真的对 JWT 验证的细节感到困惑。我知道它必须在服务器上完成,但 JWT 也是在服务器上生成/签名的。
所以这意味着(对粗体部分感到困惑):
- 用户发出登录请求(用户/密码被发送到服务器)
- 服务器检查用户的存在和正确的密码,返回签名的 JWT
- 客户端收到JWT,发回服务器验证?
- 服务器验证 JWT,然后返回 OK 响应?
如果服务器是生成和签署 JWT 的服务器,那为什么还需要验证呢?这对我来说有意义的唯一方法是如果您在前端进行验证,我知道这是一个很大的禁忌。
我显然不清楚这一点。有人能帮我填空吗?
解决方案
假设您在两个不同的服务器上有两个 api(或者您可以将其映像在无服务器平台上,这样就没有直接共享的资源) -[POST]login
和[GET]orders
. [POST]login
如果给定的凭证有效,您的API 将生成一个 JWT 令牌,[GET]orders
并将仅返回授权客户的已下订单。那么步骤应该是
- 您的客户将发送
[POST]login
请求。该 API 将验证凭证并生成 JWT 令牌。客户端应存储接收到的 JWT 令牌。 - 当客户端要发送
[GET]orders
请求时,它应该将 JWT 令牌放入请求中,否则会得到 401 未授权。 - 然后服务器验证给定的 JWT 令牌是否有效。不仅可以验证 JWT 令牌本身,还可以验证多个数据(rfc7519有几个可选声明,以便您可以使用它们,或者您可以放置自定义数据来验证,例如:权限)。
当您有多个 RESTful API 端点时,JWT 非常有用。您不需要管理会话(当然可以),因为它可以存储大量数据,您可以轻松获取客户的信息,而无需从 db 或其他东西中检索它。