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


猜你喜欢

  • 使用 MongoDB 进行数据缓存和预读取

    在前端开发过程中,常常会用到数据缓存和预读取技术,以提高网站的响应速度和性能。在 MongoDB 中,我们可以使用它的内置缓存和预读取机制,来帮助我们更好地优化网站的性能。

    4 天前
  • ECMAScript 2017 中的 Object.is 与 === 的区别

    ECMAScript 2017 中的 Object.is 与 === 的区别 在 JavaScript 中,判断两个值是否相等是常常需要解决的问题。而在 ECMAScript 2017 中,新引入了一...

    4 天前
  • 在 Node.js 中解析 CSV 文件的完整指南

    CSV(Comma Separated Values)是一种用于存储和传输结构化数据的标准格式。在 web 应用程序中,通常需要将 CSV 文件解析为 JSON 对象,以便在应用程序中使用。

    4 天前
  • Babel 在编译 ES6 的 Array.includes() 时的一个 bug

    在 ES6 中,引入了新的数组方法 Array.includes() 用于查找数组中是否包含某个元素。然而,在使用 Babel 编译 ES6 代码时,我们可能会遇到一个关于 Array.include...

    4 天前
  • Express.js 中的静态文件服务器指南

    在前端开发过程中,我们经常需要将静态文件(如图片、样式文件、JavaScript 文件等)部署到服务器上,以供浏览器访问。而 Express.js 提供了一种简单方便的方式来实现静态文件服务器的功能。

    4 天前
  • Serverless 架构下的多云运维实践经验分享

    前言 随着云原生技术的发展,更多的应用开始采用 Serverless 架构来实现快速开发和快速部署。Serverless 架构具有无服务器的特点,可以提供更好的弹性和可扩展性,同时也减少了维护成本。

    4 天前
  • AngularJS 中的 $http 请求缓存处理

    AngularJS 是一个优秀的前端开发框架,它提供了丰富的 API,其中 $http 是用于与服务器进行数据交互的核心服务之一。在实际的开发中,我们常常需要处理 $http 请求的缓存,以提高应用的...

    4 天前
  • SSE 与 Web 缓存的协作方式介绍

    前言 在开发 Web 应用程序时,优化页面响应速度是极为重要的一项工作。其中,浏览器缓存是一种非常重要的优化方案。而在同时使用 SSE 和 Web 缓存时,它们之间的协作方式会影响页面的响应速度和内容...

    4 天前
  • 使用 React 的 immutable.js 优化重复渲染

    随着 React 的广泛应用,我们越来越依赖它来构建高性能的 Web 应用程序。但是,有些情况下我们仍然可能遇到性能问题,其中最常见的问题是重复渲染。重复渲染是指 React 总是在应用程序中重新绘制...

    4 天前
  • 使用 Nginx 提高 Web 应用性能

    在开发 Web 应用时,我们经常会遇到性能瓶颈的问题。在这种情况下,使用 Nginx 可以帮助我们提高 Web 应用的性能。本文将介绍如何使用 Nginx 来提高 Web 应用的性能,包括配置 Ngi...

    4 天前
  • 如何使用 TypeScript 框架构建 RESTful API 并进行单元测试

    介绍 TypeScript 是一种在 JavaScript 之上构建大型应用程序的语言。它附加了静态类型和其他面向对象的特性,从而使代码更易于理解和维护。在本文中,我们将探讨如何使用 TypeScri...

    4 天前
  • 探讨在 Next.js 中使用 RxJS 的可行性

    简介 RxJS 是一种用于处理异步事件序列的 JavaScript 库,与 React 和 Next.js 紧密结合的能力使得它成为前端开发的热门选择。但是,在 Next.js 中使用 RxJS 的可...

    4 天前
  • Tailwind CSS 如何自定义字体及其样式?

    Tailwind CSS 是一个流行的现代 CSS 框架,它能够大大简化前端开发人员的工作。其中一个方便的功能是自定义字体及其样式,使您的应用程序与众不同。本文将详细介绍 Tailwind CSS 中...

    4 天前
  • Docker 镜像的版本管理

    什么是 Docker 镜像 Docker 镜像是用于构建 Docker 容器的基础。镜像是一个轻量级、可移植的可执行环境,其中包含应用程序和其所有依赖项。Docker 镜像是使用 Dockerfile...

    4 天前
  • 解决 Promise 异步编程在低版本浏览器中不兼容的问题

    Promise 是 ES6 异步编程新标准的一部分,其在解决异步编程中回调地狱的问题上占有重要作用。它是一个对象,表示一个异步操作的最终完成或失败。 但是在低版本的浏览器中,Promise 并没有被完...

    4 天前
  • 响应式设计下的翻页效果实现技巧

    响应式设计下的翻页效果实现技巧 随着移动设备的普及,越来越多的网站开始采用响应式设计。在响应式设计中,页面的布局和元素的大小会根据不同设备的屏幕大小和分辨率而自适应调整。

    4 天前
  • ES6中的对象字面量扩展和解构赋值的进阶用法

    1. 背景 ES6带来了很多方便的语法糖,其中对象字面量扩展和解构赋值是非常实用的两个特性。它们已经成为前端代码中的常见语法了。本文将介绍ES6中对象字面量扩展和解构赋值的进阶用法,包括:动态属性名、...

    4 天前
  • Restful API vs GraphQL API - 针对 API 新人的简介

    在开发前端应用程序时,必须考虑到与后端的通信。为了实现这种通信,Web 开发人员通常使用 API(应用程序编程接口)。目前,最常用的 API 是 Restful API 和 GraphQL API,那...

    4 天前
  • ECMAScript 2021: 新特性 Reflect.metadata() 详解

    ECMAScript 2021 (ES12) 是 JavaScript 最新的标准,该标准引入了许多新的特性和语法,其中一个最令人瞩目的特性是 Reflect.metadata()。

    4 天前
  • 如何在 Jest 中进行安全性测试?

    在现代 Web 应用程序开发中,安全性已成为一个极为重要的问题。在许多情况下,安全性测试是开发流程中一个必不可少的部分。在前端开发领域中,Jest 是一个广泛使用的测试框架,它可以帮助开发人员编写测试...

    4 天前

相关推荐

    暂无文章