如何在 Express.js 中使用 Passport.js 实现身份认证

阅读时长 8 分钟读完

前言

在现代 Web 应用程序中,身份认证是非常关键的一步,它能够保护应用程序免受恶意攻击以及保护用户的安全。Express.js 是一款非常适合用于构建 Web 应用程序的轻量级框架,而 Passport.js 是一款非常流行且易于使用的 Node.js 身份认证中间件。

在本文中,我们将介绍如何使用 Passport.js 在 Express.js 中实现身份认证,包括如何设置和配置 Passport.js,如何实现不同类型的身份认证策略以及如何保护路由和 API。

关于 Passport.js

Passport.js 是一款 Node.js 身份验证中间件,它可以支持多种身份验证策略,并可以无缝集成到 Express.js 应用程序中。

Passport.js 使用策略(Strategy)来执行身份认证,这些策略可以是本地身份验证(用户名和密码)或第三方身份验证(如 Google,Facebook 等)。Passport.js 同时也支持单点登录(SSO)以及多重身份验证等高级功能。

如何使用 Passport.js

在开始使用 Passport.js 之前,请确保您已经安装了 Node.js 和 Express.js。

1. 安装 Passport.js

使用 npm 安装 Passport.js:

同时安装您所需的身份验证策略,例如:

这里我们使用了两个策略:本地身份验证和 Google OAuth。

2. 配置 Passport.js

在您的 Express.js 应用程序中引入 Passport.js:

稍后我们将详细讲解如何配置一些常用的身份验证策略。

3. 实现 LocalStrategy

首先我们实现一下本地身份验证策略,该策略使用用户名和密码验证用户。首先在数据库或其他存储区域中存储注册的用户名和密码。

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

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

在上述代码中,我们创建了一个名为 'local' 的新本地身份验证策略。在验证请求时,Passport.js 使用该策略来检查用户名和密码,并根据结果调用 done 函数。

4. 实现 GoogleStrategy

接下来我们来实现第三方身份验证策略。在本例中,我们将使用 Google OAuth 做演示。要使用此策略,您需要先注册一个 Google API。在注册成功之后,您将拥有一个 Client ID 和 Client Secret。将这些值存储在环境变量中,并更新下面的代码:

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

在上述代码中,我们首先通过将 Google 的 Client ID 和 Client Secret 存储在环境变量中来初始化 GoogleStrategy。然后,我们定义了一个回调函数,该函数在验证成功后被调用,并将 profile 数据传递给 done 函数。在此处,您可以使用 profile 数据来验证,查找或创建用户记录。

5. 序列化和反序列化用户

在 Passport.js 中,序列化(serialization)和反序列化(deserialization)是非常重要的概念。在序列化期间,Passport.js 将用户对象转换为唯一的标识符(例如用户名或 ID)。然后,在反序列化期间,它将使用该标识符重新检索用户对象。因此,您需要在您的应用程序中实现序列化和反序列化方法。

在上述代码中,我们编写了一个简单的序列化函数,它使用用户 ID 作为标识符。在反序列化期间,我们检索存储区域中的用户并将其传递给 done 函数。这样,Passport.js 知道如何将请求附加到正确的用户记录上。

6. 使用 Passport.js

现在您已经完成了 Passport.js 的设置和配置,接下来我们将学习如何在 Express.js 中实现身份认证。

登录

要登录,您需要为请求启用 Passport.js,然后使用 authenticate 方法来执行身份验证。对于本地身份验证,您可以使用以下代码:

在上述代码中,我们使用 authenticate 方法来执行身份验证。如果身份验证成功,则用户将被重定向到根路径,否则将重定向到登录页面。

对于 Google OAuth,您可以使用以下代码:

在上述代码中,我们首先定义一个可以发送到 Google 的地址,以获取用户名和密码。然后,在用户返回应用程序时,我们通过回调地址接收数据。之后,我们使用 authenticate 方法来执行身份验证,如果身份验证失败,则将用户重定向到登录页面。

保护路由和 API

现在您已经知道如何登录,接下来我们将学习如何保护某些路由和 API。

要保护路由,您可以使用以下代码:

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

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

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

在上述代码中,我们首先定义了一个名为 isLoggedIn 的函数,并检查用户是否已经通过身份验证。如果已经验证,则允许用户继续,否则将用户重定向到登录页面。

对于 API,您可以使用以下代码:

在上述代码中,我们定义了一个基本身份验证策略,并将其传递给 authenticate 方法。基本身份验证使用 HTTP 标头传输用户名和密码,在本例中,我们使用了一个简单的基本身份验证策略来保护 /api/user 路由。

结论

在这篇文章中,我们介绍了如何在 Express.js 中使用 Passport.js 来实现身份认证。我们详细介绍了如何配置 Passport.js 和实现不同类型的身份验证策略。我们还讨论了如何保护路由和 API,以确保您的应用程序和数据得到充分的保护。

Passport.js 是一个非常强大和灵活的身份验证中间件,您可以选择自己需要的身份验证策略以满足您的应用程序需求。因此,我鼓励您在实践中进行尝试,并探索更多的身份认证策略和功能。

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

纠错
反馈