Node.js 中使用 JSON Web Tokens 实现用户认证

阅读时长 5 分钟读完

随着前端技术的发展,越来越多的应用开始采用前后端分离的架构,前端应用需要与后端 API 交互来获取数据。而在这个过程中,身份验证和访问控制是一个很重要的问题。JSON Web Tokens(JWT)是一个轻便而安全的方法,它可以在前端和后端之间传递验证信息,同时避免了会话的状态管理问题。

什么是 JSON Web Tokens

JSON Web Tokens 是一种开放标准(RFC 7519),它定义了一种紧凑、自包含的、URL 安全的方式来传输信息。JWT 是一种基于 JSON 编码的 token,它包含了一些声明,这些声明描述了被授权的实体(通常是用户)以及被授权的访问。JWT 可以使用 HMAC 算法或者公钥/私钥对签名,从而保持其完整性。

一个 JWT token 包含了三个部分,它们分别是:

  • Header:包含 token 的类型和所使用的算法。
  • Payload:包含声明(claims)信息,其中根据需要可以自定义很多声明。
  • Signature:对前两部分经过哈希后的结果进行签名。

这里是一个 JWT 的典型样例:

其中,Header 和 Payload 部分都使用 Base64Url 编码,而 Signature 部分则是使用特定算法计算得到的哈希值。

如何使用 JWT 实现用户认证

在 Node.js 中使用 JWT 实现用户认证非常简单,这里我们采用 jsonwebtoken 这个第三方库。首先,在 Node 项目中安装该库:

接下来,我们写一个用户登录的 API,在用户验证通过后生成 JWT token 并返回给客户端:

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

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

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

上述代码中,我们首先从请求中获取用户名和密码等信息,然后进行验证。如果验证通过,我们就可以根据用户的信息生成一个 payload 对象,并调用 jsonwebtoken 的 sign 方法生成 JWT token。注意,这里的 secretKey 是用于签名的密钥,请根据需要进行更改。

接下来,让我们看一下如何在每个请求中进行用户认证:

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

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

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

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

上述代码中,我们定义了一个中间件函数 verifyToken,该函数用于验证用户是否已经登录,并根据 token 的有效性判断用户是否具有访问页面的权限。在该函数中,我们首先从请求头中获取 Authorization 字段,并解析出其中的 JWT token。然后,我们调用 jsonwebtoken 的 verify 方法对 token 进行验证。如果 token 被篡改或者已经过期,则会抛出异常,此时我们就认为用户未通过验证,返回 401 错误。

最后,我们可以在需要进行身份验证的路由中使用 verifyToken 中间件,如果用户通过验证,则继续执行后续代码。

总结

在 Node.js 中使用 JWT 实现用户认证是一个非常方便的方法,它既安全又灵活,可以绕过会话状态管理的固有问题。在实际应用中,我们应该根据具体的需求来使用 jwt.sign 和 jwt.verify 方法,并采取一些基本的措施来确保密钥的安全性。

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

纠错
反馈