在现代 Web 应用程序中,身份验证和授权是必不可少的。传统的身份验证方式包括 Cookie 和 Session,但这些方式存在一些问题,比如跨域请求和 CSRF 攻击。JSON Web Token(JWT)是一种更加安全和可靠的身份验证方式,它将用户信息以 JSON 格式进行编码并加密,然后将其存储在 Token 中,传输过程中不需要 Cookie 和 Session。
本文将介绍如何使用 JWT 保护 Express.js 应用程序。我们将详细讨论 JWT 的工作原理和使用方法,并提供示例代码来帮助读者更好地理解。
JWT 的工作原理
JWT 由三部分组成:Header、Payload 和 Signature。其中 Header 包含算法和类型信息,Payload 包含用户信息,Signature 包含加密信息。
当用户登录时,服务器生成一个 Token 并将其发送给客户端。客户端将 Token 存储在本地,并在每个请求中将其发送给服务器。服务器使用密钥对 Token 进行解密和验证,并从 Payload 中获取用户信息。如果 Token 有效,则服务器返回请求的数据,否则返回错误信息。
JWT 的优点在于它不需要存储用户信息,而是将用户信息编码为 Token,这使得它更加灵活和可扩展。此外,JWT 还可以用于跨域请求和移动应用程序中的身份验证。
使用 JWT 保护 Express.js 应用程序
下面是使用 JWT 保护 Express.js 应用程序的示例代码。
首先,我们需要安装并导入两个 npm 包:jsonwebtoken 和 express-jwt。jsonwebtoken 用于生成和验证 JWT,express-jwt 用于验证 JWT 是否有效。
const jwt = require('jsonwebtoken'); const expressJwt = require('express-jwt');
然后,我们需要生成一个密钥,用于加密和解密 JWT。这个密钥应该是一个随机字符串,不要将其硬编码在代码中。
const secret = 'mysecret';
接下来,我们需要创建一个登录路由,用于验证用户信息并生成 JWT。
-- -------------------- ---- ------- ------------------ ----- ---- -- - ----- - --------- -------- - - --------- -- -------- -- --------- --- ------- -- -------- --- -------- - -- -- ----- ----- ----- - ---------- -------- -- ------- - ---------- ---- --- ---------- ----- --- - ---- - --------------------------------- - ---
在上面的代码中,我们首先从请求体中获取用户名和密码,并进行验证。如果验证通过,我们使用 jwt.sign 方法生成一个 Token,并将其作为 JSON 格式返回给客户端。expiresIn 参数表示 Token 的有效期,这里设置为 1 小时。
接下来,我们需要保护需要身份验证的路由。我们可以使用 expressJwt 中间件来验证 Token 的有效性,并从 Payload 中获取用户信息。
app.get('/protected', expressJwt({ secret }), (req, res) => { const { username } = req.user; res.send(`Hello, ${username}!`); });
在上面的代码中,我们使用 expressJwt 中间件来验证 Token 的有效性。如果 Token 无效,expressJwt 会返回一个 401 错误。如果 Token 有效,expressJwt 会将 Payload 中的用户信息存储在 req.user 中,我们可以从中获取用户名并返回欢迎消息。
最后,我们需要处理错误信息。我们可以使用 expressJwt 错误处理程序来处理 Token 无效的情况。
app.use((err, req, res, next) => { if (err.name === 'UnauthorizedError') { res.status(401).send('Token 无效'); } else { next(); } });
在上面的代码中,我们使用 expressJwt 错误处理程序来处理 Token 无效的情况。如果 Token 无效,该处理程序将返回一个 401 错误,否则将继续执行下一个中间件。
结论
使用 JWT 保护 Express.js 应用程序是一种更加安全和可靠的身份验证方式。本文介绍了 JWT 的工作原理和使用方法,并提供了示例代码来帮助读者更好地理解。希望本文能够对读者在实际开发中使用 JWT 提供帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675bb50fa4d13391d8f72a28