Express.js 中 JWT 鉴权的实现方法

阅读时长 6 分钟读完

什么是 JWT?

JWT(JSON Web Token)是一种基于 Token 的用户身份认证方式,当用户认证成功后,服务端会生成一段包含用户身份信息的 Token,这个 Token 在客户端存储,每次请求时都携带这个 Token 发送给服务器,服务器使用特定的算法对 Token 进行解密并验证,如果验证成功,则认为请求是合法的。

Token 是一段非常长的字符串,包含三部分,分别是 Header、Payload 和 Signature,其中 Header 和 Payload 都是 JSON 格式的,Signature 是采用指定算法对 Header、Payload 和密钥一起加密后的结果。

为什么要使用 JWT?

使用 JWT 鉴权的优点在于:

  1. 简单易用:JWT 不需要在服务端存储用户身份信息,只需要在生成 Token 时把用户身份信息加密后加入 Payload 中,减少服务端存储的压力。
  2. 安全可靠:JWT 采用密钥对 Token 进行加密和解密,只有拥有密钥的人才能对 Token 进行验证和解密,避免了用户信息被泄露的风险。
  3. 适用于分布式系统:由于 JWT 的 Token 包含了用户的身份信息,因此可以用于分布式系统中,多个服务之间可以共享用户的身份信息。

在 Express.js 中,可以使用 jwt 和 express-jwt 来实现 JWT 鉴权,下面是具体的实现步骤:

步骤1:安装依赖

在项目的根目录下,使用以下命令安装 jwt 和 express-jwt 依赖:

步骤2:生成 Token

在用户登录成功后,服务器需要生成一个包含用户身份信息的 Token,下面是一个生成 Token 的示例代码:

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

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

在上面的代码中,使用 jsonwebtoken 的 sign() 方法生成 Token,其中 payload 表示需要加密的用户身份信息,secret 表示加密的密钥,expiresIn 表示 Token 的有效期。

步骤3:设置路由鉴权

在需要进行鉴权的路由中,使用 express-jwt 中间件来对 Token 进行验证,下面是一个设置路由鉴权的示例代码:

在上面的代码中,使用 express-jwt 中间件来验证 Token,secret 表示解密的密钥,当 Token 校验成功后,会自动把用户身份信息加入 req.user 对象中,可以通过 req.user 访问到用户的身份信息。

步骤4:捕获错误

当 Token 验证失败时,需要捕获相关的错误信息,并返回给客户端,下面是一个捕获错误的示例代码:

在上面的代码中,使用 express 中的错误处理中间件对错误进行捕获和处理,如果错误类型是 UnauthorizedError,则表示 Token 校验失败,需要返回相关的错误信息。

总结

在 Express.js 中使用 JWT 鉴权可以有效地提升用户身份认证的安全性和可用性,同时应用 JWT 鉴权也可以方便实现分布式系统中的用户身份共享功能。下面是本文的示例代码::

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

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

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

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

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

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

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

我们可以使用 Postman 工具进行测试,首先进行登录操作(请求方法:POST,请求地址:http://localhost:3000/login,请求 body:{"username": "admin", "password": "123456"}),成功登录后会返回 Token,接下来在请求头中添加 Autherization 属性,把 Token 作为属性值,然后再请求访问 http://localhost:3000/protected,如果 Token 验证通过,会返回 200 状态码和成功信息,否则会返回 401 状态码和错误信息。

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

纠错
反馈