什么是 JWT
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络上传输信息,特别是在 Web 应用程序中进行身份验证和授权。JWT 是一种安全的方式,可以在客户端和服务器之间传递信息,确保数据在传输过程中不会被篡改或伪造。
JWT 由三部分组成:
- Header:包含 JWT 的类型(即 JWT)和使用的算法(例如 HMAC、SHA256 或 RSA)。
- Payload:包含要传输的信息,例如用户 ID、角色等。
- Signature:使用密钥对 Header 和 Payload 进行签名,以确保数据不被篡改。
如何使用 JWT 保护 RESTful API
在 RESTful API 中,我们可以使用 JWT 来实现身份验证和授权。当用户登录后,服务器会生成一个 JWT,并将其发送给客户端。客户端在后续请求中将 JWT 发送回服务器,服务器使用密钥对 JWT 进行验证。如果 JWT 有效,则表示用户已经通过身份验证,并且可以访问受保护的资源。
以下是使用 JWT 保护 RESTful API 的步骤:
步骤一:用户登录
当用户登录时,服务器会生成一个 JWT,并将其发送给客户端。JWT 中包含了用户 ID、角色等信息。
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ------ - ----------- -- ---- ------------------ ----- ---- -- - ----- - --------- -------- - - --------- -- -------- -- --------- --- ------- -- -------- --- -------- - -- -- --- ----- ----- - ---------- --- -- ----- ------- -- ------- - ---------- ---- --- ---------- -------- ----- ----- --- - ---- - ---------------------- -------- ------ -------- ---------- --- - ---
步骤二:验证 JWT
在后续请求中,客户端需要将 JWT 发送回服务器。服务器使用密钥对 JWT 进行验证,以确保其有效性。如果 JWT 有效,则表示用户已经通过身份验证,并且可以访问受保护的资源。
-- -------------------- ---- ------- -- -- --- -------- ---------------- ---- ----- - ----- ----- - -------------------------- -- -------- - ------ ---------------------- -------- ------ -------- ----------- --- - ----------------- ------- ----- -------- -- - -- ----- - ------ ---------------------- -------- ------ -------- -------- --- - -------- - -------- ------- --- - -- ------ --------------------- ------------ ----- ---- -- - ---------- -------- ----- -------- -------- --- ---
步骤三:更新 JWT
JWT 通常有一个过期时间。如果 JWT 过期,则需要重新生成。客户端可以在每次请求中将 JWT 发送回服务器,服务器将检查 JWT 是否已过期。如果 JWT 过期,则服务器将生成一个新的 JWT,并将其发送回客户端。
// 更新 JWT app.get('/refresh', verifyToken, (req, res) => { const token = jwt.sign(req.user, secret, { expiresIn: '1h' }); res.json({ success: true, token }); });
总结
JWT 是一种安全的方式,可以在客户端和服务器之间传递信息,确保数据在传输过程中不会被篡改或伪造。在 RESTful API 中,我们可以使用 JWT 来实现身份验证和授权。通过上述步骤,我们可以轻松地保护我们的 API,避免未经授权的访问。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66372a7cd3423812e4551d8f