使用 Passport.js 和 Express.js 进行身份验证

阅读时长 10 分钟读完

介绍

在现代 Web 应用程序中,身份验证是至关重要的一个功能。它可以确保用户的安全,防止信息泄漏和攻击,同时也可以为应用程序提供更多的功能和用户体验。在前端实现身份验证非常常见,这需要一些工具和库来让它变得更加简单和可信。

Passport.js 是一个非常流行的 Node.js 应用程序中的验证库。它提供了不同的验证策略,例如本地验证、社交媒体验证等等。在本文中,我们将探讨如何使用 Passport.js 与 Express.js 结合实现身份验证。

注意:本文需要读者具有基本的 Node.js 和 Express.js 开发知识,如果你还不了解,请先学习相关知识。

安装 Passport.js

首先,让我们安装 Passport.js 库。在终端中执行以下命令:

此命令将在您的项目中安装 Passport.js 库。此库提供了身份验证的基本功能,例如定义验证策略、验证流程等等。

安装 Passport.js 的验证策略

在 Passport.js 中,我们需要为每种验证类型(例如本地验证和社交媒体验证)选择和安装相应的验证策略。让我们先安装本地验证策略 passport-local

在终端中执行以下命令:

此命令将安装 passport-local 策略,使我们可以在 Express.js 中添加本地身份验证功能。

实现身份验证

好的,现在我们已经安装了必要的库和策略,我们可以着手实现身份验证了。

配置 Passport.js

首先,我们需要在我们的 app.js 或者 index.js`(或其他入口文件)配置 Passport.js。

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

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

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

在上面代码中,我们首先引入了 passport 库以及 passport-local 策略。然后,我们配置 Passport.js,使用 passport.initialize() 初始化 Passport.js。接下来,我们使用 passport.use() 指定本地身份验证策略。在下面的代码中,我们将使用 passport-local 策略,并指定验证的字段为 email。然后,在策略的回调函数中,我们可以在这里添加验证逻辑。

对于密码建议使用bcrypt等库进行密码加密处理,以增加密码安全性。

实现注册功能

下面,让我们看一下如何实现注册功能。

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

在上面的代码中,我们首先添加了一个 POST /signup 路由,当用户注册时将触发此路由。在路由处理程序中,我们使用 passport.authenticate() 方法,指定验证的策略为 local-signup。这个 local-signup 策略是我们在 Passport.js 配置中定义的策略,并且它将在用户注册时使用。注意,我们将 req, res, and next 传递给了 passport.authenticate() 方法,这是必须的。然后,在验证完成后,如果出现错误,我们将返回一个 500 状态码和错误消息。如果用户重复,我们将返回一个 400 状态码和友好错误消息。最后,在注册成功时,我们将返回 200 状态码和注册成功消息。

在我们讨论的策略配置函数中done({} , user/ false / error) 按照此格式把不同的返回结果传递,第一个对象为空,第二个表示等待具体的验证结果(比如该用户名是否存在或登录结果)

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

在上面的代码中我们使用了'local-signup'策略其中一个验证功能,定义了验证时使用的字段,而指定的回调函数则具有验证功能。其中第一个参数是req,这是因为,有时需要再本地验证的字段外添加其他验证参数。 在验证函数中,我们在数据库中查找是否存在相同的用户名,如果存在,则返回一个错误消息。否则,我们创建一个新的用户对象,并保存到数据库中。如果用户创建成功,我们将使用 done() 方法将其返回。

实现登录功能

现在,我们已经了解了如何实现注册功能,接下来让我们来看一下如何实现登录功能。

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

在上面的代码中,我们添加了一个 POST /login 路由。在这个路由处理程序中,我们使用 passport.authenticate() 方法指定验证的策略为 local-login。这个策略是我们在 Passport.js 配置中定义的策略,并且它将使用登录功能。在验证完成后,如果出现错误,我们将返回一个 500 状态码和错误消息。如果用户不存在,我们将返回一个 401 状态码和错误消息。最后,在成功登录时,我们将使用 req.logIn() 方法将用户存储到会话中,并返回 200 状态码和登录成功消息。

下面是我们在 Passport.js 配置中添加的策略,它将用于处理本地登录请求。

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

在上面的代码中,我们对密码进行了一个 validPassword() 方法的调用,以确保密码正确。这个 validPassword() 方法需要在我们的 User 对象中实现,以便我们可以在验证用户时使用它。

现在你可以在 node.js 的命令行下启动项目并发起POST请求测试验证:

  1. 注册一个新用户:

返回

  1. 登录:

返回

  1. 验证失败:

返回

总结

Passport.js 是一个非常有用的库,它提供了不同的验证策略,使我们可以为我们的应用程序添加一个高效的身份验证功能。在这篇文章中,我们讨论了如何使用 Passport.js 和 Express.js 结合实现身份验证,包括注册和登录功能,以及如何指定验证策略和配置 Passport.js。我们还提供了一些示例代码以帮助你更好地理解本文所述内容。希望这篇文章对你有所帮助!

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

纠错
反馈