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

当我们在开发使用 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


猜你喜欢

  • MongoDB 使用优化技巧整理

    随着互联网技术的不断发展,越来越多的网站开始采用 MongoDB 作为其数据存储方案。与传统的关系型数据库相比,MongoDB 具有高性能、高可扩展性以及易于部署等优点。

    1 年前
  • TypeScript 中的字符串模版如何使用 ${} 表达式

    TypeScript 是一种由微软开发的开源编程语言,它支持 JavaScript 的所有语法功能,同时还提供了额外的类型检查和注释支持。在前端开发中,经常需要处理字符串拼接的问题,而 TypeScr...

    1 年前
  • Fastify 异步支持及相关实践

    前言 随着移动互联网和云计算的发展,Web 应用程序的重要性日益增加。在开发过程中,遇到的最常见的问题是性能(如快速响应、高并发等)和代码可维护性。使用 Node.js 作为服务器环境,可以有效解决这...

    1 年前
  • ECMAScript 2016 之 Object.setPrototypeOf 和 Reflect.ownKeys

    ECMAScript 2016 引入了两个新的特性:Object.setPrototypeOf 和 Reflect.ownKeys。这两个特性对于前端开发非常有用,可以帮助我们更好地进行对象的操作和管...

    1 年前
  • Redis CPU 占用过高的一些可能原因及排查方法

    背景介绍 Redis 是一个常用的 NoSQL 数据库,被广泛应用于各种互联网应用的缓存、计数器、消息队列等场景中。但在使用 Redis 时,我们可能会遇到 Redis CPU 占用过高的问题,这提示...

    1 年前
  • 在 Vue.js 中使用 GraphQL 及其生态系统:例子使用

    GraphQL 是一种 API 查询语言和运行时,它被设计为更高效、强大和灵活的替代 REST。Vue.js 是一种流行的前端框架,用于构建交互式应用程序。在本文中,我们将探讨如何在 Vue.js 中...

    1 年前
  • Mongoose 操作 MongoDB 日期类型的技巧与应用

    在 MongoDB 中,日期类型是一种常见的数据类型,也是前后端开发过程中最常遇到的数据类型之一。当我们使用 Node.js 进行 MongoDB 开发时,使用 Mongoose 框架可以帮助我们更方...

    1 年前
  • ES11 模块调试技巧:如何在浏览器中优化模块导入

    随着 JavaScript 的不断发展,使用模块化管理代码已成为必不可少的技术。ES6 推出了类似于 Node.js 的模块加载方式,并对其进行了进一步改进。ES11 在此基础上提供了一些优化工具,使...

    1 年前
  • Next.js 服务器端渲染性能优化实践

    什么是 Next.js Next.js 是一款 React 应用程序的服务端渲染框架,其的优点在于简单易用,且具有良好的性能表现,完美支持 React 的多种特性,使得业务团队可以快速构建高可靠性的 ...

    1 年前
  • LESS 构建符合 Web 标准的页面的最佳实践

    前端开发离不开 CSS,而 LESS 是一款广泛应用的样式预处理器,它能够扩展 CSS 的功能,使得样式表更加有逻辑性,简洁易维护。本文将介绍如何使用 LESS 构建符合 Web 标准的页面的最佳实践...

    1 年前
  • 在 Node.js 中使用 Async 模块进行异步流程控制的技巧

    在 Node.js 中进行异步流程控制是开发者经常遇到的一个问题。这个问题有多种解决方法,其中一个比较流行的是使用 Async 模块。本文将介绍如何使用 Async 模块来管理异步流程,并提供一些实用...

    1 年前
  • ES6 中的 generator 函数异步流控制及解决同步异步问题

    ES6 引入了 Generator 函数,可以通过控制异步流程、解决同步异步问题等,具有很强的实用性。本文将详细介绍 ES6 中 Generator 函数的异步流控制及解决同步异步问题的应用,以及通过...

    1 年前
  • 解决 React 中的跨组件通信问题

    React 是目前前端开发中非常流行和常用的框架之一,但在开发过程中,我们经常遇到跨组件通信的问题,也就是一个组件需要与其他组件进行数据交互。这个问题的解决涉及到 React 的基本理念和一些最佳实践...

    1 年前
  • Sequelize 快速入门指南,5 分钟上手数据库 ORM 框架

    什么是 Sequelize? Sequelize 是一个基于 Node.js 的 ORM(Object Relational Mapping) 框架,它将 JavaScript 对象和关系型数据库之间...

    1 年前
  • AngularJS SPA 应用中使用 $http 实现 Http Get 请求

    引言 在现代 Web 开发中,SPA(Single Page Application)已经成为一种很流行的开发模式,而 AngularJS 正是跨越了这一模式的优秀框架之一。

    1 年前
  • 使用 Express.js 处理 HTTPS 请求的方法

    介绍 HTTPS 是一种常用于加密互联网连接的协议,常用于在线购物、银行等网站的传输安全保证。 在前端开发中,我们需要能够处理 HTTPS 请求,以便构建安全且完整的 web 应用程序。

    1 年前
  • Flexbox 布局实现移动端购物车页面布局

    在移动开发中,购物车页面是非常常见的功能之一。而如何实现一个美观且易用的购物车页面布局呢?Flexbox 布局是一个非常好的选择,本文将详细介绍如何使用 Flexbox 布局实现移动端购物车页面布局,...

    1 年前
  • 前后端 Socket.IO 实现双向通信的方法详解

    Socket.IO 是一个实时双向通信库,可用于浏览器和服务器之间的实时通信,同时也提供了跨浏览器和跨平台的支持。它是一个非常强大的工具,可以在前后端之间进行多种形式的双向通信。

    1 年前
  • Jest 应用到 Express 服务侧单元测试的思路及具体实现

    单元测试是前端开发中不可或缺的一部分,它可以避免代码出现一些问题,提高代码质量和稳定性。本文主要介绍如何使用 Jest 将单元测试应用到 Express 服务侧中,涉及到 Jest 的使用、测试用例编...

    1 年前
  • Angular 中使用 RxJS 的 tap 操作符

    RxJS 是一个基于响应式编程的 JavaScript 库,它提供了一种优雅而强大的处理异步数据流的方式。Angular 作为现代 Web 开发中一种流行的前端框架,也有广泛的应用场景。

    1 年前

相关推荐

    暂无文章