Express.js 中的身份验证和授权

在 Web 应用程序中,安全是一项至关重要的任务。我们需要确保只有授权的用户才能访问敏感数据或执行某些操作。Express.js 是一种类似于 Node.js 框架,它可以帮助我们构建服务器端应用程序。在这篇文章中,我们将深入学习如何在 Express.js 中实现身份验证和授权,使用 Passport.js 和 JSON Web Tokens。

为什么我们需要身份验证和授权?

在任何 Web 应用程序中,特别是那些涉及信任和安全的应用程序中,身份验证和授权是两个非常重要的概念。

简单来说,身份验证是确保一个用户是谁他声称自己的过程。如果他可以成功地通过身份验证,我们可以确定他的身份,并允许他进行特定的操作。

授权是确保一个用户拥有哪些权利或权限的过程。基于他的身份,我们可以通过授权来决定他可以访问哪些资源或执行哪些操作。

身份验证和授权通常是用于保护敏感数据和操作(如密码、个人资料、付款等)不受未经授权的访问。

使用 Passport.js 进行身份验证

Passport.js 是一个流行的身份验证库,他使用策略模式来支持多种身份验证方式,包括本地和第三方验证。让我们看一个使用本地验证的例子。

安装 Passport.js

使用 npm 命令安装 Passport.js

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

配置 Passport.js

在 app.js 文件顶部导入 Passport.js 和 Passport Local Strategy

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

在 app.js 文件中,我们需要将 Passport.js 初始化,使用 Express 的应用程序并将其作为应用程序中间件。这应该发生在定义路由之前。

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

现在让我们定义一个本地验证策略。

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

在本地验证策略中,我们首先在我们的用户存储库中查找传入的用户名,如果我们找到了一个用户,我们将它与传入的密码进行比较。如果我们发现密码与用户名不匹配,则不允许用户通过身份验证。

最后我们返回一个回调。如果用户成功通过身份验证,我们将传递进去用户的信息,否则回调返回失败。

配置 Express 应用程序路由

接下来,我们需要配置基于 Passport.js 的本地验证策略的路由。这个路由将接收 POST 请求,该请求包含用户凭据,以验证用户是否有权进行相应的请求。

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

在这个例子中,我们传递了本地验证策略名称 'local',这将导致 Passport.js 使用我们的本地验证策略来验证用户的凭据。

使用 Passport.js 来保护路由

现在,让我们看一个使用 Passport.js 来保护路由的例子。

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

在这个例子中,我们定义了一个名为 'ensureAuthenticated' 的自定义中间件。该中间件通过检查用户是否已通过身份验证来保护受保护的路由。

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

在 ensureAuthenticated 中间件中,我们先检查用户是否已通过身份验证。如果用户已通过身份验证,我们直接调用 Express 的 next() 函数向下传递请求。否则,我们将他们重定向到我们的登录页面。

使用 JSON Web Tokens 进行授权

JSON Web Tokens(JWT)是一个用于跨域站点认证的开放标准,它通常用于在用户和服务器之间传递身份验证和授权信息。JWT 由三个部分组成:头部、有效载荷和签名。

头部是一个包含算法和类型的 JSON 对象。有效载荷包含我们要传递的有关用户的信息。签名是一个带有密钥的哈希算法,它用于验证有效载荷的完整性和身份。

以下示例显示了如何使用 JWT。

创建 JWT

创建一个 JWT 非常简单。我们只需要使用 jwt 库中的 sign 方法,并传递要在有效载荷中放置的信息和我们的密钥。

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

默认情况下,JWT 是无状态的。这意味着我们的服务器不需要在响应之间维护任何状态。

解密 JWT

接下来,我们需要确保使用我们的密钥和哈希算法来解密并验证我们的 JWT。

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

在这个例子中,我们使用 verify 方法来验证我们的 JWT,并将其解密为内容对象。我们可以通过 decoded 对象访问有效载荷的信息。

将 JWT 传递到客户端

为了将 JWT 传递到客户端,我们可以将其存储在 Cookie 或 Authorization 头中,然后将其传递到每个请求中。以下代码示例展示了如何将 JWT 存储在 Authorization 头中。

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

在这个例子中,我们将 JWT 存储在 Authorization 头中,并使用 Express 中间件来解析和验证该标头。如果 JWT 有效,我们将有效载荷解码为 req.user 对象,从而使我们可以轻松地检查用户是否具有适当的权限。

结论

身份验证和授权对于任何 Web 应用程序都是必需的,它们有助于确保我们的应用程序是可信和安全的。在这篇文章中,我们学习了如何使用 Passport.js 和 JSON Web Tokens 在 Express.js 中实现身份验证和授权。此外,我们还提供了示例代码来加深理解。

现在我们已经知道了如何在 Express.js 中实现身份验证和授权,我们可以开始构建安全的 Web 应用程序。记住,您的应用程序只有在安全时才能为用户提供最佳体验。

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