介绍
在 Web 开发中,用户认证一直是一个重要的话题。通常情况下,我们需要通过用户名和密码对用户进行认证。但是,对于拥有多个 Web 应用的公司来说,需要为不同的应用维护多个用户系统。这时候,使用单点登录(SSO)就成为了一个不错的选择。
在本文中,我们将介绍如何使用 Passport 进行用户认证,并实现 SSO 功能。这里的 SSO 采用基于 OAuth2 的方式进行认证。
Passport 是一个 Node.js 的身份验证中间件。它提供了不同的策略,允许您选择不同的认证方式。在本文中,我们将使用 Passport-OAuth2 策略。
环境准备
在使用 Passport 进行用户认证前,需要安装一些依赖:
npm install express passport passport-oauth2 ejs
实现思路
要想使用 Passport 进行用户认证,需要以下步骤:
- 配置 Passport,并设置认证策略;
- 在认证发起方(Client)中,跳转至认证提供方(Provider)的认证页面;
- 用户在认证提供方中输入用户名和密码,通过认证;
- 认证提供方将认证请求重定向至 Client 的回调地址,并携带认证成功的信息;
- 在回调地址中,Client 获取到认证成功的信息,并验证其有效性;
- 认证完成,Client 可以在其它路由中通过 req.user 获取到认证成功的用户信息。
那么,下面我们就来一步步实现这些步骤。
实现步骤
配置 Passport
在 app.js 中配置 Passport:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- -------------- - ------------------------------------ ----- --------- - ----------------- ----- ------------- - --------------------- ----- -------- - --- --------------- - ----------------- ---------------------------------------- --------- ------------------------------------ --------- ---------- ------------- -------------- ------------ -------------------------------------- -- -------- ------------- ------------- -------- --- - -- ------------------ -------- - ------------ ------------ --- - -- -----------------------
在这里,我们使用了 passport-oauth2
策略,并设置了 authorizationURL
、tokenURL
、clientID
、clientSecret
、callbackURL
等参数。其中,callbackURL
是在认证提供方中设置的回调地址。
认证发起方跳转至认证提供方页面
在路由中添加以下代码:
const passport = require('passport'); router.get('/auth', passport.authenticate('oauth2'));
在这里,我们使用 passport.authenticate
方法,传入 oauth2
策略,即使用 OAuth2 认证方式进行认证。
认证提供方输入用户名和密码,通过认证
在认证提供方中,用户需要输入用户名和密码,并通过认证。认证提供方需要根据用户提供的信息,生成认证凭证,然后重定向至 Client 的回调地址,同时携带认证凭证信息。
以下是认证提供方的示例代码:
-- -------------------- ---- ------- --------------------- -------- ----- ---- - ----- - --------- -------- - - --------- -- ----- -------- - -------- ------ ----- ----------- - -------------------- -- ----------- ------ ----- ----- ----------- - --- ---------------------------- ------------------------------------ ------------- ------------------------------- ---
在认证提供方中,需要分别处理 /login
和 /authorize
两个路由。这里我们使用的是 OAuth2 的流程,因此,在 /login
路由中,我们需要将认证信息重定向至 /authorize
。
Client 获取到认证成功的信息
在回调地址 /auth/callback
中,Client 获取到认证成功的信息,并验证其有效性。如果验证通过,就可以将其存储在 session 中,用于其它路由的访问。
router.get('/auth/callback', passport.authenticate('oauth2'), function (req, res) { req.session.accessToken = req.user.accessToken; res.redirect('/'); });
认证完成,Client 可以在其它路由中获取到认证成功的用户信息
在其它路由中,可以通过 req.user
获取到 accessToken
和 refreshToken
等认证成功的用户信息。
以下是一个示例路由:
-- -------------------- ---- ------- ----- ------- - ---------------------------------- ------------------- ----- -------- ----- ---- - ----- ------- - - ---- -------------------------------- -------- - -------------- ------- ------------------------- -- ----- ----- -- ----- -------- - ----- ----------------- ------------------- ---
在这里,我们使用了 request-promise-native
库发送了一个请求获取用户信息,并在请求头中添加了认证凭证。
总结
本文介绍了如何使用 Passport 进行用户认证,并实现 SSO 功能。在实现过程中,我们逐步分析了每个步骤,并提供了相应的示例代码。
通过本文的学习,读者可以了解 Passport 的使用方法,以及如何实现基于 OAuth2 的单点登录。在实际项目中,可以根据自己的需要进行相应的调整和扩展。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649eeab548841e9894b67fb8