在使用 Express.js 时如何实现 Token 认证?

阅读时长 7 分钟读完

在 Web 应用程序中,Token 认证是一种非常常见的身份验证方式。当用户登录成功后,应用程序会为其颁发一个 Token,并在后续的请求中使用这个 Token 来验证用户身份。在 Express.js 中实现 Token 认证也非常简单。本文将从以下几个方面详细介绍如何在 Express.js 中实现 Token 认证,包括:

  1. 什么是 Token 认证
  2. 实现 Token 认证的基本原理
  3. 如何在 Express.js 中实现 Token 认证
  4. 示例代码

什么是 Token 认证

Token 认证是一种基于 Token 的身份验证方式。当用户登录成功后,应用程序会为其颁发一个 Token,并将其保存在客户端。当用户访问需要身份验证的资源时,应用程序会验证客户端提交的 Token 是否合法,如果合法则认为用户已经通过身份验证。

Token 认证相比传统的用户名密码认证方式有如下优点:

  • 安全性更高:Token 是由服务器生成的一串字符串,可以根据一定的算法来生成,因此 Token 认证相对于传统的用户名密码认证更加安全可靠。
  • 不依赖 Cookies:Cookie 是存储在客户端的数据,如果不小心泄露了 Cookie,攻击者可能会通过伪造用户身份来进行攻击,而使用 Token 认证则不需要依赖 Cookies。
  • 可扩展性强:Token 认证支持多种形式的 Token,例如 JWT Token、OAuth Token 等,可以根据需要自由拓展,非常灵活。

实现 Token 认证的基本原理

Token 认证的基本原理可以用以下几个步骤来描述:

  1. 用户登录时,向服务器提交用户名和密码;
  2. 服务器验证用户名和密码是否正确,如果正确则生成一个 Token,然后将 Token 发送给客户端;
  3. 客户端将 Token 保存在本地,下次请求时在请求头中通过 Authorization 字段携带 Token;
  4. 服务器接收到请求后,从请求头中获取 Token,并验证其合法性;
  5. 如果 Token 合法,则允许用户访问需要身份验证的资源。

如何在 Express.js 中实现 Token 认证

在 Express.js 中实现 Token 认证非常简单,只需要借助第三方库即可。本文以 jsonwebtoken 库为例,通过以下步骤来介绍如何在 Express.js 中实现 Token 认证:

  1. 安装 jsonwebtoken 库,使用 npm 命令安装即可:npm install jsonwebtoken --save
  2. 在登录成功后生成 Token,并将 Token 发送给客户端。代码如下:
-- -------------------- ---- -------
----- --- - ------------------------
----- ------ - ------------------

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

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

上面的代码使用 jwt.sign() 方法来生成 Token,其中第一个参数为一个对象,用于存储需要传递的信息。第二个参数为密钥字符串,用于验证 Token。第三个参数为选项,用于设置 Token 的过期时间等信息。生成的 Token 将通过 JSON 格式发送给客户端。

  1. 在需要身份验证的路由中进行 Token 的验证,代码如下:
-- -------------------- ---- -------
-- ---------
----------------- ----- ---- -- -
  ----- ----- - --------------------------

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

上面的代码首先从请求头中获取 Token,如果获取不到则返回 401 状态码,表示身份验证不通过。如果获取到了 Token,则使用 jwt.verify() 方法来验证 Token,其中第一个参数为 Token 字符串,第二个参数为密钥字符串。如果 Token 验证失败,则返回 401 状态码,如果验证成功则可以根据需要进行一些业务逻辑判断。

示例代码

以下是完整的示例代码,你可以将其运行在本机,然后通过浏览器访问 http://localhost:3000/loginhttp://localhost:3000/admin 来查看效果。

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

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

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

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

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

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

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

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

总结

本文介绍了在 Express.js 中如何实现 Token 认证,描述了 Token 认证的基本原理,并给出了详细的代码示例。希望读者能够通过学习本文了解到 Token 认证的基本原理和实现方法,从而为自己的 Web 应用程序添加更安全、更灵活的身份验证方式。

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

纠错
反馈