如何使用 Node.js 和 JWT 实现认证和授权?

Node.js 是一个强大且流行的服务器端 JavaScript 运行环境,它提供了许多便捷的工具和库,用于开发高效的 Web 应用程序。与此同时,JSON Web Tokens (JWT) 成为了一种简单、安全、灵活的身份验证和授权机制。

在本篇文章中,我们将深入 Node.js 和 JWT 的工作原理,并使用示例代码演示如何用 Node.js 和 JWT 实现身份验证和授权。

什么是 JWT?

JSON Web Tokens 是一种在客户端和服务器端之间传输信息的安全机制。JWT 格式的数据是一个由三部分组成的字符串,它们用点号分隔开:

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

其中:

  1. 头部(Header):JWT 的头部通常包含两部分,第一部分是 token 的类型,这里使用 JWT。第二部分是所使用的算法,例如 HS256 或 RS256 等等。

  2. 载荷(Payload):一般是包含了用户信息、发放时间(issued at)、过期时间(expires)、作用域(scope)、颁发者(issuer)等信息。

  3. 签名(Signature):为了验证数据的完整性,数字签名是必不可少的。将头部和载荷的内容结合起来,再加上我们的密钥(secret),通过指定的算法进行签名,生成签名字符串。

JWT 的主要优势在于其灵活性和自包含性。因为所以 JWT 包含了自身的签名,因此在 JWT 发放时无需在服务器存储状态信息。这使得 JWT 可以在不同的服务器上进行交易,并且无需进行同步。

Node.js 上的 JWT 的工作方式

Node.js 上使用 JWT 的方式与其他语言和框架并没有太大的不同。我们可以使用 jsonwebtoken 库来生成、验证和解码 JWT。下面是一个示例:

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

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

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

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

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

在上面的示例中,我们导入了 jsonwebtoken 库,使用 sign 方法生成包含给定信息的 JWT。然后我们使用 secretKey 进行签名。

接下来,我们想要解码这个令牌,可以使用 verify 方法:

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

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

上述代码将返回一个对象,包含了所包含的用户名和角色。

在 Node.js 中使用 JWT 进行身份验证

接下来,我们将演示如何将 JWT 用作身份验证机制。

假设我们有一个包含登录、注册和个人资料页面的网站。用户在登录时,会提交他们的用户名和密码。为了验证用户的身份,我们需要进行以下步骤:

-查找 MongoDB 中是否存在此用户的记录。 -如果用户存在,将其 ID 和其他信息存储在 JSON 对象中。 -使用 jsonwebtoken 库、签名密钥、信息 JSON 和一些选项(例如过期时间)来生成 JWT。 -将 JWT 返回给客户端。

现在,在用户访问个人资料页面时,我们需要验证他们是否已经登录。我们可以使用中间件将 JWT 配置为需要验证:

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

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

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

在上述代码中,我们创建了一个 auth 函数,用于从 HTTP 标头中提取令牌,并使用 jsonwebtoken 库校验它。如果令牌无法校验,将返回未验证的表单。

现在,我们可以将此 auth 函数配置为我们个人资料页面的中间件,以确保用户已登录并具有适当的权限。

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

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

在上述代码中,我们使用 Node.js 的 express 库创建一个应用程序,当 /profile 路由标识请求时,通过 auth 中间件验证用户是否登录,并在通过时发送包含用户信息的 JSON 响应。在未通过身份验证之前,此路由将返回未验证的表单。

在 Node.js 中使用 JWT 进行授权

JWT 不仅在身份验证中非常有用,它在授权方面也非常有用。

假设我们有一个后台管理员可以查看并删除帖子的用户。我们可以使用 JWT 将权限信息存储在载荷中,并针对不同用户类型(例如管理员和普通用户)分配不同的 JWT:

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

-- ---

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

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

在上述代码中,我们创建了一个 adminPayload 对象,该对象包含管理员的信息和角色。我们使用 jsonwebtoken 库、签名密钥和其他选项,例如过期时间,创建一个包含这些信息的 JWT。在这种情况下,我们将其在有效期内恒定为 1 小时。

现在,我们可以通过修改我们上面演示的 auth 中间件来检查用户是否拥有适当的角色:

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

在上述代码中,我们检查使用 Bearer 方案的 HTTP 令牌(与身份验证中的相同)是否包含与“管理员”(即“admin”角色)相关的字串。如果是,则 next() 函数被调用,让请求通过继续执行。否则,将返回具有 401 响应状态代码的 JSON。

结论

在本文中,我们演示了如何使用 Node.js 和 JWT 实现身份验证和授权机制。我们详细介绍了 JWT 的作用和工作原理,并展示了如何使用 jsonwebtoken 库将 JWT 用于 Node.js 中。

在实际应用中,JWT 提供了一种安全、简单和灵活的身份验证和授权方案。它的自包含性和与 Node.js 的兼容性使其适用于多个 Web 应用程序场景。

示例代码:https://github.com/yhzheng/Node.js-and-JWT

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671b69919babaf620fab482e