使用 Express.js 和 JWT 实现身份验证

身份验证是任何应用程序中的重要部分,特别是在 Web 应用程序中。在 Web 应用程序中,身份验证是确保用户是谁他们声称自己是的过程。在本文中,我们将使用 Express.js 和 JWT(JSON Web Tokens)来实现身份验证。

什么是 Express.js?

Express.js 是一个基于 Node.js 平台的 Web 应用程序框架。它提供了一组强大的功能,使开发人员能够轻松地构建 Web 应用程序。它是一个灵活的框架,可以通过添加中间件来扩展其功能。

什么是 JWT?

JSON Web Tokens(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式来表示信息。它是一种安全的方式,用于在网络上传输信息,因为它可以通过数字签名进行验证和信任。

JWT 由三部分组成:标头、负载和签名。标头包含有关令牌的元数据,例如令牌的类型和算法。负载包含有关令牌的信息,例如用户 ID、过期时间和其他元数据。签名是一个数字签名,用于验证令牌是否被篡改。

实现身份验证

在本文中,我们将使用 Express.js 和 JWT 实现身份验证。我们将创建一个简单的 Web 应用程序,该应用程序允许用户注册、登录和查看其个人资料。

安装依赖

在开始之前,我们需要安装一些依赖项。我们将使用 Express.js、jsonwebtoken、bcrypt 和 body-parser。打开终端并运行以下命令:

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

创建服务器

我们将从创建一个简单的服务器开始。在项目根目录中创建一个名为 server.js 的文件,并添加以下代码:

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

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

这将创建一个监听端口为 3000 的服务器。我们可以通过运行以下命令来启动服务器:

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

注册用户

现在,我们将创建一个端点,该端点允许用户进行注册。我们将使用 bcrypt 来加密用户的密码,并将用户信息保存在数据库中。在 server.js 文件中添加以下代码:

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

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

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

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

这将创建一个名为 /register 的端点,该端点将用户信息保存在数组中。我们使用 bcrypt 来加密密码,并使用 async/await 来等待哈希密码的完成。如果发生错误,我们将发送一个 500 错误响应。

登录用户

现在,我们将创建一个端点,该端点允许用户进行登录。在 server.js 文件中添加以下代码:

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

这将创建一个名为 /login 的端点,该端点将检查用户是否存在,然后检查密码是否匹配。我们使用 bcrypt.compare 来比较密码,并返回一个成功或失败的响应。

生成 JWT

现在,我们将生成一个 JWT,该 JWT 包含用户 ID 和用户名。在 server.js 文件中添加以下代码:

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

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

这将创建一个名为 /login 的端点,该端点将生成一个 JWT 并将其发送回客户端。我们使用 jwt.sign 来生成 JWT,其中包含用户名和一个秘密密钥。我们将 JWT 发送回客户端,以便客户端可以在以后的请求中使用它进行身份验证。

验证 JWT

现在,我们将创建一个中间件,该中间件将验证 JWT 并确保用户已经登录。在 server.js 文件中添加以下代码:

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

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

这将创建一个名为 authenticateToken 的中间件,该中间件将检查 JWT 是否存在并是否有效。如果 JWT 不存在或无效,则中间件将发送 401 或 403 响应。如果 JWT 有效,则中间件将将用户添加到请求中,并将请求传递给下一个处理程序。

我们还创建了一个名为 /profile 的端点,该端点需要进行身份验证。如果 JWT 有效,则端点将返回用户的个人资料。

总结

在本文中,我们使用 Express.js 和 JWT 实现了身份验证。我们创建了一个简单的 Web 应用程序,该应用程序允许用户进行注册、登录和查看其个人资料。我们使用 bcrypt 来加密密码,并使用 JWT 来进行身份验证。这个应用程序可以作为一个很好的起点,用于构建更复杂的 Web 应用程序。

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