Express.js 中使用 JWT 进行身份验证的教程

阅读时长 5 分钟读完

在现代 Web 应用中,用户认证和授权是不可或缺的一部分。传统的 cookie/session 认证机制可能会有一些问题,例如跨站攻击 (XSS) 和跨域攻击 (CSRF) 等。因此,使用 JSON Web Token (JWT) 进行身份验证是越来越流行的选择。

本文将介绍如何在 Express.js 中使用 JWT 进行身份验证,包括生成 JWT,验证 JWT 和保护路由等。

什么是 JWT

JWT 是一种基于 JSON 格式的轻量级身份验证机制。它由三部分组成:

  • Header: 包含加密算法等元数据
  • Payload: 包含身份验证信息,例如用户 ID、角色等
  • Signature: 由 Header 和 Payload 构成的字符串按照一定规则加密而成,用于验证 token 是否合法

JWT 的优点在于:

  • 不需要使用 cookie/session
  • 不需要在服务器端存储 token
  • 可以跨域传递
  • 可以自定义有效期和权限级别

安装依赖

在使用 JWT 前,需要安装 jsonwebtoken 和 express-jwt 这两个依赖。jsonwebtokens 是一个生成/解析 JWT 的工具,而 express-jwt 则是一个 Express.js 中使用 JWT 的中间件。

可以使用 npm 安装这两个依赖:

生成 JWT

在用户登录成功后,需要向客户端返回一个 JWT。这个 JWT 可以包含一些用户信息,例如用户 ID、用户名等。可以使用 jsonwebtoken 库来生成这个 JWT。

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ------------------------
----- --- - ----------

-- -- -------- - --
------------------ ----- ---- -- -
  ----- ---- - - --- ---- --------- ----- --
  ----- ----- - -------------- --------- - ---------- ---- ---
  ---------- ----- ---
---

在上面的代码中,我们使用 jwt.sign() 方法生成 JWT。第一个参数是要包含在 JWT 中的用户信息,第二个参数是加密秘钥,第三个参数是 JWT 的有效期。

验证 JWT

在客户端发送请求时,需要将这个 JWT 作为 Authorization header 发送到服务器端。服务器端可以使用 express-jwt 中间件来验证这个 JWT,并获取其中的用户信息。

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ------------------------
----- ---------- - -----------------------
----- --- - ----------

-- -- ----------- ---
-------------------- ------- -------- ----------- ----- ---------- ----

-- --------
-------------- ----- ---- -- -
  ----- ---- - ---------
  ---------------
---

在上面的代码中,我们首先使用 express-jwt 中间件来验证 JWT。{ secret: 'secret' } 表示使用 secret 作为秘钥进行验证。unless 方法表示除了 /login 之外的路由都需要进行 JWT 验证。

如果 JWT 验证通过,通过 req.user 就可以获取当前用户信息。

保护路由

有时候,我们需要保护一些需要授权才能访问的路由。可以使用自定义 middleware 来实现。

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ------------------------
----- ---------- - -----------------------
----- --- - ----------

-- -- ----------- ---
-------------------- ------- -------- ----------- ----- ---------- ----

-- --- ----------
-------- ---------------- ---- ----- -
  -- ---------- -
    -------
  - ---- -
    --------------------
  -
-

-- --------- --- --
--------------------- ------------ ----- ---- -- -
  ---------- -------- ---------- ------ ---
---

在上面的代码中,我们首先定义了一个自定义 middleware,用来检查当前用户是否已经登录。如果已登录,则继续执行下一个 middleware,否则返回 401。

接着,我们定义了一个受保护的路由 /protected。这个路由需要经过 JWT 验证,并且需要经过我们定义的自定义 middleware requireAuth 验证。

总结

在本文中,我们介绍了如何在 Express.js 中使用 JWT 进行身份验证。首先我们了解了 JWT 是什么,以及它的优点。接着,我们通过安装依赖的方式引入了 jsonwebtokens 和 express-jwt 两个库。然后,我们介绍了如何生成 JWT 和验证 JWT,并通过自定义 middleware 的方式保护受保护的路由。希望这篇文章对你的学习和开发有所帮助!

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ae4a0f48841e9894a4919f

纠错
反馈