随着互联网的普及,越来越多的网站和应用需要用户认证和授权的功能。而 JWT(JSON Web Token)是一种常用的认证协议,它可以在前后端之间传递信息,并且比传统的 Cookie 机制更加灵活和安全。本篇文章将介绍如何在 Express.js 中使用 JWT 实现用户认证。
JWT 是什么?
JWT 是一种基于 JSON 格式的认证协议,它由三段 base64 编码的字符串组成,格式如下:
<Header>.<Payload>.<Signature>
其中,Header 包含算法和类型等信息,如下所示:
{ "alg": "HS256", // 采用 HMAC-SHA256 算法进行签名 "typ": "JWT" }
Payload 包含要传递的信息,如用户 ID、角色等,如下所示:
{ "sub": "123456", // 用户 ID "name": "张三", // 用户名 "role": "admin" // 角色 }
Signature 是根据 Header、Payload 和密钥计算的签名,用于验证信息的完整性和真实性。
Express.js 中使用 JWT 实现用户认证
下面我们将介绍如何在 Express.js 中使用 JWT 实现用户认证。我们将假设已经有一个用户认证的 API,可以根据用户名和密码返回一个 JWT,如下所示:
-- -------------------- ---- ------- ----- --- - ----------------------- ----- ------ - ---------- ----- ----- - - ---- -- ----- -------- --------- --------- ---- -- ----- ------- --------- ------- - -------- ------------------- - ----- ------- - - ---- -------- ----- ---------- ----- --------- -- ------ - ------ ----------------- ------- - ---------- ---- -- - -------- ------------------- ---- - ----- - ----- -------- - - -------- ----- ---- - ------------ -- ------ --- ---- -- ---------- --- --------- -- ------ - ----- ----- - ------------------- ---------- ----- -- - ---- - ---------------------- -------- --------------- ------- -- - - -------------- - --------------
这个 API 可以从客户端接收用户名和密码,并返回一个 JWT。
使用中间件验证 JWT
接下来,我们需要在 Express.js 中添加一个中间件,用于验证每个请求是否带有有效的 JWT。
-- -------------------- ---- ------- ----- --- - ----------------------- ----- ------ - ---------- -------- --------- ---- ----- - ----- ----- - ---------------------------------- ----- -- ------- - --- - ----- ------- - ----------------- ------- -------- - ------- ------ - ----- ------- - ---------------------- -------- --------------- ------- -- - - ---- - ---------------------- -------- --------------- ------- -- - - -------------- - ----
这个中间件从请求头中获取 JWT,并且验证签名和有效期等信息。如果 JWT 验证成功,会将解码后的 Payload(即用户信息)存储在 req.user 中,并且调用 next() 继续执行后续的中间件和路由处理器。
现在,我们可以在 Express.js 中使用这个中间件,如下所示:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- ---- - ----------------- ----- --- - --------- ----------------------- ------------------ ---------------------------- --------------------- ----- ----- ---- -- - ---------- -------- ------- ------------------ -- -- ---------------- -- -- - ------------------- ------- -- ----------------------- --
这个 Express.js 应用程序有两个路由,一个是用于用户认证的 /login,另一个是需要用户认证的 /protected。使用 auth 中间件可以保证只有携带有效 JWT 的请求才能访问 /protected 路由,否则会返回 401 错误。
总结
本篇文章介绍了如何在 Express.js 中使用 JWT 实现用户认证,包括从用户认证 API 获取 JWT、使用中间件验证 JWT 等步骤。使用 JWT 可以提高认证和授权的安全性和灵活性,可以在前后端之间传递信息,并且避免了传统 Cookie 机制可能带来的跨站请求伪造(CSRF)攻击。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f11832f6b2d6eab3af3619