如何使用 Express.js 和 Passport.js 实现 OAuth 2.0 认证

在现代的 Web 开发中,OAuth 2.0 是一种重要的认证和授权协议。它可以方便地实现各种类型的授权,如用户授权、第三方 API 授权等。

在前端开发中,使用 Express.js 和 Passport.js 可以轻松实现 OAuth 2.0 认证。本文将介绍 OAuth 2.0 的原理和工作流程,并演示如何使用 Express.js 和 Passport.js 实现 OAuth 2.0 认证。

OAuth 2.0 原理和工作流程

OAuth 2.0 是基于 HTTP 协议的认证和授权协议。它允许资源提供方(也称为认证服务器)允许用户授权第三方客户端(也称为应用)访问受保护的资源,而无需暴露用户的凭据。

OAuth 2.0 认证流程主要包括以下流程:

  1. 用户访问客户端,客户端向认证服务器请求授权。
  2. 认证服务器要求用户提供身份证明,例如用户名和密码。
  3. 认证服务器验证用户身份,并且要求用户授权客户端访问资源。
  4. 用户授权认证服务器授权客户端访问资源。
  5. 客户端使用授权令牌向资源服务器请求访问受保护的资源。
  6. 资源服务器验证授权令牌,如果有效则返回资源。

实现 OAuth 2.0 认证

下面我们将使用 Express.js 和 Passport.js 实现 OAuth 2.0 认证。我们将使用 GitHub 作为 OAuth 2.0 提供者。

第一步:创建应用

在 GitHub 上创建一个新的 OAuth 应用,以便我们可以使用 GitHub 作为 OAuth 提供者。在 GitHub 上,转到“个人资料设置”>“开发人员设置”>“OAuth 应用程序”>“新 OAuth 应用程序”。

我们将需要提供以下信息:

  • 应用名称
  • 主页 URL
  • 回调 URL

在回调 URL 中,我们将使用 http://localhost:3000/auth/github/callback。这是我们将在下一步使用的 URL。

在创建应用程序之后,您将获得以下信息:

  • 客户端 ID
  • 客户端密钥

请牢记这些信息,因为我们将使用它们来验证客户端身份。

第二步:设置 Express 应用程序

现在我们可以开始设置 Express 应用程序了。我们将创建一个名为 oauth-demo 的应用程序,并使用以下命令安装 Express.js 和 Passport.js:

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

让我们创建一个名为 server.js 的文件,并将以下代码放入其中:

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

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

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

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

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

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

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

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

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

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

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

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

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

我们导入了 Express.js、Passport.js、Passport-Github 等包,并将它们添加到我们的应用中。这里,我们使用 GitHubStrategy 进行用户验证,并将其添加到 Passport.js 中。

我们还定义了两个路由:/ 和 /api/protected。前者用于欢迎用户,后者用于受保护的资源。

第三步:设置环境变量

现在,让我们在 .env 文件中设置所有必要的环境变量。这样我们就可以安全地保存我们的 OAuth 客户端 ID 和密钥。

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

现在我们已经准备好运行我们的服务器了!请使用以下命令运行服务器:

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

现在,访问 http://localhost:3000,保证我们可以看到“欢迎 xxx”的消息。现在访问 http://localhost:3000/api/protected,因为您尚未进行身份验证,您将看到“403 Forbidden”消息。

第四步:进行身份验证

为了进行身份验证,让我们点击欢迎消息旁边的登录按钮。这将触发我们的 /auth/github 路由,将我们重定向到 GitHub 认证页面。

在那里,您将被要求授予我们的应用程序对您的 GitHub 资料的访问权限。

如果您成功授权我们的应用程序,您将被重定向到 http://localhost:3000/auth/github/callback 并启动我们的回调函数。将跳过我们的页面并重定向到主页。

现在,您应该可以看到您的 GitHub 用户名出现在欢迎消息右侧。同样,现在访问 http://localhost:3000/api/protected,你会发现现在您有权限访问受保护的资源了。

结论

在本文中,我们学习了 OAuth 2.0 的工作原理和工作流程,并演示了如何使用 Express.js 和 Passport.js 实现 OAuth 2.0 认证。这为我们的应用程序提供了受保护的服务和资源,并使我们无需暴露用户的凭据即可访问他们的数据。

虽然这只是 OAuth 2.0 的基础,但它为我们提供了构建更安全和更高级的认证和授权功能的基础。希望这篇文章对你有所帮助,并且为你在前端开发中使用 OAuth 2.0 提供了足够的指导。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6711f084ad1e889fe201b297


猜你喜欢

  • Hapi.js 的扩展设置:测试你的插件

    在 Hapi.js 中开发自定义插件的时候,很少有人会考虑如何测试它们。但是测试是软件开发过程中至关重要的一部分,它可以让你确信你的代码是有效的、健壮的和稳定的。本文将介绍如何在 Hapi.js 中测...

    9 天前
  • GraphQL 的优点及缺点:前端开发者详解

    在 Web 应用程序开发中,数据传输和请求通常需要使用 REST APIs。但是,REST APIs 也存在一些缺点,例如无法灵活地处理不同请求和响应,频繁地获取不必要的数据和相关性等问题。

    9 天前
  • 如何在 Deno 中使用 JWT 进行身份验证

    JWT (JSON Web Token) 是一种用于身份验证的开放标准,它可以安全地在客户端和服务器之间传递信息,而无需在每个请求时都进行身份验证。Deno 是一个现代的 JavaScript 和 T...

    9 天前
  • 如何使用 Socket.io 实现多人在线问卷调查

    在现代互联网时代,交互性和用户参与度是非常重要的指标,问卷调查是一种常见的用户互动方式,也是一种非常有效的数据收集方式。但是,在一些重要事项上,单个用户的观点并不足以了解大众的看法。

    9 天前
  • PM2 如何管理子进程?

    什么是 PM2? PM2 是一个进程管理工具,可以帮助我们管理 Node.js 进程。它具有自动重启,负载均衡,进程守护和监控等功能。PM2 还支持多进程运行,可以提高 Node.js 应用程序的性能...

    9 天前
  • React Router 动态路由与异步加载的最佳实践

    在复杂的前端项目中,实现动态路由和异步加载组件是必不可少的。其中,React Router 是一个流行的路由库,提供了丰富的路由功能和组件生命周期的管理。本文将介绍 React Router 官方推荐...

    9 天前
  • Jest 用户指南:如何为前端应用编写测试?

    在前端开发中,自动测试是一个非常重要的环节。它不仅可以帮助我们提高代码质量和可维护性,还可以减少 bug 的出现。Jest 是一个流行的 JavaScript 测试框架,它提供了简单且强大的 API,...

    9 天前
  • 响应式设计下的导航栏设计优化

    随着移动设备的普及,越来越多的用户使用各种尺寸的屏幕来访问网站。响应式设计可以适应不同尺寸的屏幕,提供更好的用户体验。然而,在响应式设计中,导航栏的设计是一个挑战。

    9 天前
  • 如何构建跨平台 GraphQL 应用程序?

    GraphQL 是一种用于 API 的查询语言,旨在为客户端提供所需的数据。从开发人员的角度来看,GraphQL 有很多优势,它不仅可以提供更好的应用性能,而且具有更好的可扩展性和可重复性。

    9 天前
  • ES9 中的新特性和语言规范

    ES9 是 ECMAScript 的第九个版本,也称为 ES2018,它在 2018 年发布。ES9 包含了一些新的特性和语法规范,这些改进可以帮助开发者更方便地编写代码。

    9 天前
  • 在 Ubuntu 16.04 上使用 PM2 运行 Node.js 应用程序

    简介 PM2 是一个流行的进程管理器,它可以帮助你管理 Node.js 应用程序的启动、停止、重启、日志、监控、故障恢复等。 在本文中,我们将学习如何在 Ubuntu 16.04 上安装并使用 PM2...

    9 天前
  • ES7 中的 Symbol.species 实现对象构造器的自定义

    随着 Web 应用的不断复杂化,前端开发中对象构造器的自定义需求越来越高。ES7 中新增的 Symbol.species 可以帮助我们实现对象构造器的自定义。在本文中,我们会详细介绍 Symbol.s...

    9 天前
  • RxJS 中的创建操作符(Creating Observable)及应用

    RxJS 是一个流行的 JavaScript 库,它提供了一种现代化的、响应式的编程范式,使前端开发人员可以更轻松地处理异步数据流。在 RxJS 中,Observable 是一个核心概念,它代表着一个...

    9 天前
  • 最常见的 GraphQL 错误及其解决方案

    随着 GraphQL 在前端开发中的广泛应用,更多的开发者开始遇到一些常见的 GraphQL 错误。在这篇文章中,我们将会讨论这些常见的 GraphQL 错误,并且提供相应的解决方案。

    9 天前
  • 如何在 ECMAScript 2015 中使用 Symbol 类型?

    引言 Symbol 是 ECMAScript 2015 中新增的一种原始数据类型,作为一种独有的属性键(key),它为对象避免了属性名的冲突,能有效地增强对象的属性保护能力。

    9 天前
  • ES9:Promise.finally 的使用方法和优化

    随着JavaScript在Web应用程序中的重要性不断提高,Promise成为了现代JavaScript中经常使用的功能。在ES6中引入了Promise,使得异步请求和处理变得更加方便。

    9 天前
  • Node.js 中如何使用 Handlebars 模板引擎

    在现代 Web 开发中,模板引擎是一个非常重要的环节。在 Node.js 程序中,可以使用 Handlebars 来进行模板渲染。Handlebars 是一个常用的模板引擎,它基于 Mustache ...

    9 天前
  • Cypress UI 测试遇到的问题及解决方案

    前言 Cypress 是一款流行的前端测试框架,由于其易用性和高效性被广泛使用。在我使用 Cypress 进行 UI 测试时,也遇到了一些常见的问题。本文将介绍这些问题以及对应的解决方案,并结合示例代...

    9 天前
  • SSE 技术在实现复杂事件推送时的优化策略

    介绍 SSE(Server-Sent Events)是HTML5的一种新特性,它是一种服务器向客户端推送数据的技术,利用 SSE 技术可以实现实时数据推送,而不需要客户端不断地向服务器发送请求。

    9 天前
  • Vue.js SPA 应用中如何优化图片加载,提升页面性能?

    在 Vue.js 的 SPA(单页面应用)中,图像是一个必不可少的部分。在许多情况下,页面加载速度和用户体验受到图像加载速度的影响。因此,在构建 Vue.js 应用程序时,我们应该考虑如何优化图像加载...

    9 天前

相关推荐

    暂无文章