在 Express.js 中使用 Passport.js 和 JSON Web Token(JWT)实现身份验证

阅读时长 9 分钟读完

当我们在开发使用 Express.js 的 Web 应用程序时,安全性是一个非常重要且需要考虑的问题。要确保只有经过身份验证的用户才能访问受保护的资源,我们需要使用身份验证和授权来控制用户的访问权限。在本文中,我们将介绍如何在 Express.js 中使用 Passport.js 和 JSON Web Token(JWT)来实现身份验证。

Passport.js 是一个广泛使用的 Node.js 身份验证中间件,它支持数百种身份验证策略,包括本地用户名和密码,社交媒体身份验证和OpenID等。JSON Web Token(JWT)是一种用于安全地交换信息的开放标准,它使用 JSON 对象进行声明,经过加密后可以安全地在用户和服务器之间传输数据。

安装和设置 Passport.js

要在 Express.js 中使用 Passport.js,我们首先需要安装它。我们可以使用 npm 安装它:

接着我们需要在我们的 Express.js 应用中配置 Passport.js。我们需要添加以下代码:

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

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

-- --- -- -------- ----------
--- ------------- - -----------------------------------
---------------- ---------------
    -------------- --------
  --------------- -----------
  ------------------- ----
-- -------- ----- ------ --------- ----- -
--- --------- --- ----- --- -------- ----- --- --------
----
展开代码

在上面的代码中,我们首先require Passport.js作为变量"passport"。然后,我们将其middleware配置通过使用express中use()方法初始化。 接下来,我们添加本地策略(localStrategy),并将其传递给Passport.js。

加密密码

在对密码进行身份验证之前,应将其加密,以确保数据的安全性。在Node.js中,bcrypt模块是最常用的模块之一,它可以将密码加密为安全的hash。我们可以使用下面的代码进行加密:

在上面的代码中,我们使用bcrypt.hash()方法来进行密码处理。第二个参数10表示加盐密码的强度。处理完密码后,我们可以将其保存到数据库中以供日后进行身份验证。

创建 JWT

要使用JWT在Express.js中实现身份验证,我们需要使用jsonwebtoken模块。我们可以使用以下代码创建JWT:

在上面的代码中,我们首先require 'jsonwebtoken'模块,然后创建JWT的“payload”数据(在这里我们只使用了一个email地址)。接着我们需要定义一个“secret”作为变量,该变量将用于加密 JWT。使用jwt.sign()函数,我们可以将我们的payload和加密密钥传递给 JWT 包生成器,并得到一个JWT。

我们可以指定JWT的过期时间,以确保安全性和保密性。在上面的代码中,我们指定JWT在一个小时之后过期(一小时后失效)。

使用JWT进行身份验证

要在 Express.js 中使用JWT进行身份验证,我们需要创建一个可重用的身份验证中间件。以下是示例代码:

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

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

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

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

-------------- - -------------
展开代码

在上面的代码中,我们首先require 'jsonwebtoken'模块,并定义一个名为 "secret"的变量,用于解密 JWT。然后,我们定义了一个名为“authenticate”的中间件来执行身份验证。

该中间件需要在每次调用受保护的路由时进行身份验证。它从请求中获取 JWT,并使用secret密钥对其进行解码。如果JWT无效或已过期,则中间件将取消验证,并发送错误响应。

集成JWT和Passport.js

要同时使用JWT和Passport.js进行身份验证,我们需要将它们集成。以下是一个示例代码片段,可以在 Express.js 应用程序文件中使用它:

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

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

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

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

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

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

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

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

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

--------------------- ------------- ------------- ---- -
    ------ ---------- -------- ----- -------- ---------- --------- ---
---
展开代码

在上面的代码中,我们首先引入Passport.js 和 ‘jsonwebtoken’ 模块。接下来,我们设置签名密钥变量“secret”和一个认证中间件“authenticate”。

在我们的Express.js应用程序中,我们使用本地策略进行身份验证并定义“login”路由。当用户提供有效的凭据时,路由将生成一个JWT并将其作为响应返回。我们使用在“authenticate”中间件中定义的“authenticate”中间件来保护“/protected”路由,并以JSON格式返回受保护资源的消息。

总结

在本文中,我们看到了如何在 Express.js 中使用 Passport.js 和 JSON Web Token(JWT)来实现身份验证。首先,我们设置 Passport.js,其次,我们加密密码及创建 JWT,并定义一个可重用的身份验证中间件来支持使用JWT进行身份验证。最后,我们集成JWT和Passport.js进行身份验证,并定义登录和受保护的路由。

使用这些技术和方法,我们可以在 Express.js 中实现更安全和可靠的用户身份验证,并保护我们的Web应用程序免受黑客攻击和数据泄漏的威胁。

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

纠错
反馈

纠错反馈