Node.js 中如何使用 Passport 进行用户认证与授权

阅读时长 11 分钟读完

随着 Web 应用程序的复杂性和数据泄露的频繁发生,用户认证和授权变得非常重要。Node.js 提供了一个称为 Passport 的中间件,它提供了一种简单且灵活的方法来保护您的应用程序。

什么是 Passport?

Passport 是 Node.js 中的身份验证中间件,它允许您为 Web 应用程序添加认证策略。它支持本地身份验证、授权(例如,Facebook、Twitter、Google 和其他身份验证服务)等。

尽管 Passport 是轻量的,但其确实拥有足够的功能,可使它成为您的 Web 应用程序中的完美身份验证和授权解决方案。

Passport 的一般结构

在使用 Passport 之前,需要先安装它。可以使用 npm 进行安装:

Passport 的常见模式分为两个部分:

  • 页面和路由
  • Passport 配置

既然了解了 Passport 的基本结构,我们现在可以重点研究在 Node.js 中使用 Passport 进行用户身份验证和授权。

身份验证

在 Web 应用程序中,身份验证是一种确认用户身份信息的过程。此过程通过搜索数据库(通常加密存储)来确认用户是否具有访问权限。Passport 为我们提供了检查用户是否有权访问特定资源的简单方法。

Passport-Local

既然我们已经了解了通过本地数据库进行身份验证的重要性,那么就是使用 Passport-Local 的时候了。正如其名称所示,Passport-Local 适用于本地身份验证功能。

安装 Passport-Local:

配置 Passport 并使用 LocalStrategy:

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

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

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

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

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

    ----
--

在 req.flash() 函数中,我们将从 Passport 回传的信息存储到 req.session 中。

在上文中,我们定义了 LocalStrategy。它使用最常用的字段 email 和 password 进行身份验证。如果用户的用户名、密码无效,当然就不会被允许访问。在上文中,登录回调函数中的 done() 仅仅是通知 Passport 用户是否被允许访问。

我们在拿到 HTML 表单的访问请求时,需要验证身份。我们可以使用 Passport 的中间件来进行身份验证,这样我们就可以在任何路由中轻松验证用户的身份信息。

以下是一个身份验证的示例,请注意上文中 serialize 和 deserialize 函数的用法:

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

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

在上述代码片段中,我们通过将 passport.authenticate() 函数作为中间件来更新路由的模型。当登录表单提交时,此模型触发身份验证回调。如果身份验证结果为失败,则重定向到 login 页面并将 err 消息作为变量传递给 handlebars 模板。

如果身份验证成功,我们就简单地重定向到我们的主页或任何其他身份验证后的页面。

控制访问权限并授权

当某个用户登录并被身份验证之后,应用程序需要控制他们所能访问的页面和内容。这就是授权的作用,它为我们提供了更加精细的手段进行筛选和策略。

其中,常见的授权策略有:

  • 基于角色的授权
  • 基于资源的授权

基于角色的授权

基于角色的授权让我们可以通过所属组来授权某个用户的访问,最常见的例子是不同用户类型的权限不同。例如,普通用户和管理员用户能够访问不同的页面和功能。

  1. 创建 User 模型以存储以下数据
-- -------------------- ---- -------
----- -------- - --------------------
----- ------ - -------------------------

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

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

---

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

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

-- ------ --- ----- --- ----- --- ------ -- -- --- ---
-------------- - ---------------------- ------------
  1. 将本地角色设置为 User,则我们可以很容易地在 login Strategy 中使用之前定义的回调来验证用户并授权访问级别。
-- -------------------- ---- -------
----- -------- - --------------------
----- ------------- - -----------------------------------
----- ---- - --------------------------

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

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

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

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

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

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

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

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

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

使用上述代码,我们可以在我们的控制器中使用 isAuthenticated 和 isAdmin。例如:

Passport 的强大功能为身份验证和授权提供了强大的支持。作为开发人员,我们必须时刻关注应用程序的安全性。了解和使用 Passport 不仅可以帮助您轻松地添加身份验证和授权功能,而且还可以帮助您更好地实现应用程序的安全性,确保数据最大程度保护。

结论

Passport 为我们提供了一个简单而强大的身份验证和授权解决方案。同时,它还提供了许多有用的策略选项,包括本地策略、Facebook 策略、Twitter 策略、GitHub 策略以及其他许多身份验证解决方案。这使得 Passport 成为开发 Web 应用程序所必需的一个工具。

在本文中,我们仅覆盖了 Passport 的一部分功能。花些时间仔细研究其官方文档,您将能够学习到更多关于 Passport 的强大功能、身份验证和授权方法,以及如何将它们应用在您的应用程序中。

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

纠错
反馈