JWT(JSON Web 令牌)
JWT 有什么用处?
JWT 有什么用处?
JWT 用于授权,授权是确保向您的服务器发送请求的用户与在身份验证过程中实际登录的用户是同一个用户。
它授权用户访问该特定系统,通常使用会话来完成。
例如,您有一个在浏览器的 cookie 中发送的会话 ID,每次客户端发出请求时,它们都会将该会话 ID 发送到服务器,服务器会检查其内存,确定用户是否具有该会话 ID,找到该用户并进行授权以确保用户具有访问权限。
在 JWT 中,它使用 JSON web 令牌而不是 cookie,这就是它的代表。
首先,我们将研究使用会话和 Cookie 来存储用户的传统用户登录系统。因此,首先发生的是用户实际上通过发布他们的电子邮件和密码从客户端登录,例如,一旦到达服务器,服务器就会进行身份验证以确保用户的电子邮件和密码正确,它将该用户存储在会话中,该会话存储在服务器的内存中,并且它会获得一个唯一的 ID,然后使用 Cookie 将该 ID 发送回浏览器,以便浏览器每次发出请求时始终具有发送到服务器的会话 ID。
例如,客户端发出另一个请求,会话 ID 与 cookie 一起发送,服务器进行计算并检查会话内存,并根据 ID 进行检查,验证用户并将响应发送回浏览器。
另一种身份验证形式是 JWT,它在开始时的工作方式非常相似,我们像以前一样向服务器发出带有电子邮件和密码的 POST 请求,但不是将信息存储在会话内存中的服务器上,而是服务器创建一个 JSON Web 令牌 (JWT),并使用自己的密钥对其进行签名,这样服务器就知道如果您更改它,那么它是无效的,它可以使用它的密钥进行检查。
这里的主要区别是服务器上没有存储任何内容,服务器不存储用户,这个 JWT 内置了有关用户的所有信息。因此服务器将 JWT 发送回浏览器,并且可以选择存储它。例如,它可以进行 cookie 存储,其工作方式类似。
客户端向服务器发送请求,其中包含 JSON Web Token,因此服务器知道正在使用它进行身份验证的用户。服务器使用自己的密钥检查该令牌,并验证此 Web Token 未被更改。如果客户端更改了 JSON Web Token 并更改了用户信息,则可以说它无效;但如果 JWT 未发生任何更改,并且用户被授权使用该资源,则服务器会将响应发送回客户端。
为什么要使用 JWT?
现在我们讨论了 JWT 的工作原理以及它是什么,让我们看看为什么要使用 JWT。
让我们看一个非常简单的 JWT 常见用例。
这里有两个不同的服务器。一家银行拥有一台服务器,运行着他们所有的银行应用程序、银行网站以及所有银行信息。他们也拥有一台单独的服务器,负责管理所有的退休计划。他们允许人们在一个完全独立的Web应用程序上投资和制定退休计划。但他们希望登录银行的用户也能自动登录他们的退休账户。因此,从银行服务器切换到退休服务器时,他们不希望用户再次登录,这样可以实现无缝切换,看起来就像在同一个应用程序上一样。这在大型行业中非常常见。
发生的情况是,当您使用基于会话的普通服务器时,您的会话存储在银行服务器中而不是退休服务器中,因此用户需要重新登录,因为他们需要将他们的会话存储在退休服务器中,因为在退休服务器中找不到来自客户端的会话 ID。
但是当您使用 JWT 时,您在银行和退休服务器之间共享相同的密钥,您需要做的就是从客户端向他们两个发送相同的 JWT,并且您将两次都通过身份验证,而无需重新登录。
因此,JWT 的重要之处在于,无论您有多少个不同的服务器,无论您有多少个不同的应用程序或负载均衡器,都没关系,只要它们之间有相同的密钥,用户就可以与任何服务器进行身份验证。
app.post('/api/login', async (req, res) => {
const { username, password } = req.body
const user = await User.findOne({ username }).lean()
if (!user) {
return res.json({ status: 'error', error: 'Invalid username/password' })
}
if (await bcrypt.compare(password, user.password)) {
const token = jwt.sign(
{
id: user._id,
username: user.username
},
JWT_SECRET
)
return res.json({ status: 'ok', data: token })
}
res.json({ status: 'error', error: 'Invalid username/password' })
})
上面是如何在 nodejs 中使用 JWT 通过 post 请求在应用程序中记录用户的示例。
文章来源:https://dev.to/shubhamyadav/jwt-json-web-token-1j19