使用 Passport.js 在 Express.js 中实现 OAuth 认证

阅读时长 7 分钟读完

OAuth 是一种开放标准,允许用户授权第三方应用访问他们在另一个服务上存储的信息,而无需提供他们的用户名和密码。它已成为许多网站和应用程序的标准授权协议。在本文中,我们将介绍如何使用 Passport.js 在 Express.js 中实现 OAuth 认证。

什么是 Passport.js?

Passport.js 是一个 Node.js 的身份验证库,它提供了一种简单的方式来处理用户身份验证。它支持多种身份验证策略,包括本地身份验证、OAuth、OpenID 等。它还提供了易于使用的中间件,使得在 Express.js 应用程序中集成身份验证变得轻松简单。

什么是 OAuth?

OAuth 是一个授权框架,允许用户授权第三方应用程序访问他们在另一个服务上存储的信息,而无需提供他们的用户名和密码。OAuth 是一个安全的授权机制,因为用户不会直接将其凭据提供给第三方应用程序。

OAuth 有三个主要角色:

  1. 用户:拥有存储在服务提供商上的数据。
  2. 服务提供商(SP):存储用户数据的网站或应用程序。
  3. 应用程序(或客户端):希望访问用户数据的第三方应用程序。

在 OAuth 流程中,应用程序通过向服务提供商发出请求来请求访问用户数据。服务提供商会要求用户授权此请求。如果用户同意,服务提供商将向应用程序提供访问令牌,该令牌允许应用程序访问用户数据。

在 Express.js 中使用 Passport.js 实现 OAuth 认证

在下面的示例中,我们将使用 Passport.js 和 Express.js 实现 OAuth 认证。我们将使用 GitHub OAuth 作为示例。

步骤 1:安装 Passport.js 和相关模块

首先,我们需要安装 Passport.js 和相关模块。我们将使用以下命令安装它们:

步骤 2:设置 GitHub 应用程序

在使用 GitHub OAuth 之前,我们需要在 GitHub 上创建一个 OAuth 应用程序。我们可以在 GitHub 的设置页面上创建一个新应用程序。在创建应用程序时,我们需要提供以下信息:

  • 应用程序名称
  • 主页 URL
  • 授权回调 URL

授权回调 URL 是在用户授权后 GitHub 将用户重定向到的 URL。我们将在下一步中使用此 URL。

步骤 3:设置 Passport.js

接下来,我们需要设置 Passport.js。我们将在应用程序的入口文件中设置 Passport.js。在这个例子中,入口文件是 app.js

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

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

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

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

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

在上面的代码中,我们首先导入 passportpassport-githubexpress-session 模块。然后,我们使用 passport.use() 方法配置 GitHub 策略。我们需要提供 GitHub 应用程序的客户端 ID、客户端密钥和授权回调 URL。在回调函数中,我们将处理 GitHub 认证。

接下来,我们使用 passport.serializeUser()passport.deserializeUser() 方法序列化和反序列化用户。我们需要将用户对象存储在会话中,以便在每个请求中使用。

最后,我们使用 express-session 中间件配置会话。我们使用 passport.initialize()passport.session() 中间件启用 Passport.js。

步骤 4:创建 GitHub 认证路由

现在,我们需要创建一个路由来处理 GitHub 认证。我们将在 app.js 中创建一个路由。

在上面的代码中,我们首先创建一个路由来处理 GitHub 认证。我们使用 passport.authenticate() 方法启用 GitHub 策略。这将重定向用户到 GitHub 授权页面。

接下来,我们创建一个回调路由来处理 GitHub 的回调。在回调函数中,我们使用 passport.authenticate() 方法处理 GitHub 认证结果。如果认证失败,我们将重定向用户到登录页面。否则,我们将重定向用户到主页。

步骤 5:保护路由

现在,我们已经设置了 GitHub 认证路由,我们需要保护某些路由。我们将在 app.js 中创建一个中间件来检查用户是否已经通过 GitHub 认证。

在上面的代码中,我们创建了一个名为 ensureAuthenticated() 的中间件。如果用户已通过 GitHub 认证,该中间件将调用 next() 方法,否则将重定向用户到登录页面。

我们现在可以使用 ensureAuthenticated() 中间件来保护我们的路由:

在上面的代码中,我们创建了一个名为 /profile 的路由。我们使用 ensureAuthenticated() 中间件来保护此路由。如果用户已通过 GitHub 认证,我们将呈现 profile 视图,并将用户对象传递给视图。

结论

在本文中,我们介绍了如何使用 Passport.js 在 Express.js 中实现 OAuth 认证。我们使用 GitHub OAuth 作为示例,并提供了示例代码。要在应用程序中使用其他 OAuth 提供程序,请参阅该提供程序的文档。OAuth 是一种安全的授权协议,许多网站和应用程序都使用它来授权用户数据的访问。

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

纠错
反馈