Node.js 中使用 Passport 进行用户认证的方法和技巧

阅读时长 6 分钟读完

介绍

在 Web 开发中,用户认证一直是一个重要的话题。通常情况下,我们需要通过用户名和密码对用户进行认证。但是,对于拥有多个 Web 应用的公司来说,需要为不同的应用维护多个用户系统。这时候,使用单点登录(SSO)就成为了一个不错的选择。

在本文中,我们将介绍如何使用 Passport 进行用户认证,并实现 SSO 功能。这里的 SSO 采用基于 OAuth2 的方式进行认证。

Passport 是一个 Node.js 的身份验证中间件。它提供了不同的策略,允许您选择不同的认证方式。在本文中,我们将使用 Passport-OAuth2 策略。

环境准备

在使用 Passport 进行用户认证前,需要安装一些依赖:

实现思路

要想使用 Passport 进行用户认证,需要以下步骤:

  1. 配置 Passport,并设置认证策略;
  2. 在认证发起方(Client)中,跳转至认证提供方(Provider)的认证页面;
  3. 用户在认证提供方中输入用户名和密码,通过认证;
  4. 认证提供方将认证请求重定向至 Client 的回调地址,并携带认证成功的信息;
  5. 在回调地址中,Client 获取到认证成功的信息,并验证其有效性;
  6. 认证完成,Client 可以在其它路由中通过 req.user 获取到认证成功的用户信息。

那么,下面我们就来一步步实现这些步骤。

实现步骤

配置 Passport

在 app.js 中配置 Passport:

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

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

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

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

在这里,我们使用了 passport-oauth2 策略,并设置了 authorizationURLtokenURLclientIDclientSecretcallbackURL 等参数。其中,callbackURL 是在认证提供方中设置的回调地址。

认证发起方跳转至认证提供方页面

在路由中添加以下代码:

在这里,我们使用 passport.authenticate 方法,传入 oauth2 策略,即使用 OAuth2 认证方式进行认证。

认证提供方输入用户名和密码,通过认证

在认证提供方中,用户需要输入用户名和密码,并通过认证。认证提供方需要根据用户提供的信息,生成认证凭证,然后重定向至 Client 的回调地址,同时携带认证凭证信息。

以下是认证提供方的示例代码:

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

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

在认证提供方中,需要分别处理 /login/authorize 两个路由。这里我们使用的是 OAuth2 的流程,因此,在 /login 路由中,我们需要将认证信息重定向至 /authorize

Client 获取到认证成功的信息

在回调地址 /auth/callback 中,Client 获取到认证成功的信息,并验证其有效性。如果验证通过,就可以将其存储在 session 中,用于其它路由的访问。

认证完成,Client 可以在其它路由中获取到认证成功的用户信息

在其它路由中,可以通过 req.user 获取到 accessTokenrefreshToken 等认证成功的用户信息。

以下是一个示例路由:

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

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

在这里,我们使用了 request-promise-native 库发送了一个请求获取用户信息,并在请求头中添加了认证凭证。

总结

本文介绍了如何使用 Passport 进行用户认证,并实现 SSO 功能。在实现过程中,我们逐步分析了每个步骤,并提供了相应的示例代码。

通过本文的学习,读者可以了解 Passport 的使用方法,以及如何实现基于 OAuth2 的单点登录。在实际项目中,可以根据自己的需要进行相应的调整和扩展。

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

纠错
反馈