Express.js 使用 JWT-token 实现权限控制

阅读时长 4 分钟读完

在现代的 Web 应用中,权限控制是一个必不可少的功能。本文将介绍如何在 Express.js 应用中使用 JWT(JSON Web Token)来实现权限控制。

什么是 JWT?

JWT 是一种用于在各方之间安全传输信息的开放标准。它可以在身份验证和信息交换方面发挥重要作用。JWT 可以使用 HMAC 算法或者 RSA 的公私秘钥对进行签名。有三个部分组成:头部、载荷和签名。其中头部和载荷是 JSON 格式的键值对,签名是使用加密算法生成的字符串。

为什么使用 JWT?

在传统的会话管理中,用户在登录之后会在服务端创建一个会话,会话 ID 保存在 Cookie 中。这种方式存在一些问题:首先,它需要使用 Cookie,而对于一些前后端分离的应用,Cookie 可能无法满足需求;其次,服务端需要保存状态,增加了服务器的复杂度;最后,服务端可能需要在多个机器之间共享状态。

JWT 可以解决这些问题:首先,它可以在无 Cookie 的情况下通过 HTTP 头部传输 Token;其次,它是无状态的,服务器不需要保存任何状态;最后,它可以很容易地在多个机器之间共享。

在 Express.js 中使用 JWT

在 Express.js 中使用 JWT 需要使用 jsonwebtoken 库。我们首先需要安装该库:

接下来,我们来看一个例子。

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

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

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

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

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

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

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

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

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

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

/login API 中,我们通过查询参数获取用户名和密码。如果用户名和密码不正确,返回 401 错误。否则,我们使用 jwt.sign() 方法来生成一个 Token,并将其返回给客户端。

/hello API 中,我们首先从 HTTP 头部获取 Authorization 字段,去掉 Bearer 前缀后得到 Token。然后我们使用 jwt.verify() 方法来验证 Token 是否合法,如果合法则返回用户信息。如果 Token 不合法,返回 401 错误。

这里的密钥 mysecret 应该放在环境变量中,而不是直接写在代码中。

总结

本文介绍了 JWT 的基本概念和在 Express.js 中的使用。使用 JWT 可以让我们更方便地实现无状态的权限控制,减轻后端服务器的负担,同时也可以提高安全性。在实际使用中,我们应该注意避免将敏感的信息存储在 JWT 中,并确保密钥的安全。

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

纠错
反馈