OAuth 是一种开放标准,允许用户授权第三方应用访问他们在另一个服务上存储的信息,而无需提供他们的用户名和密码。它已成为许多网站和应用程序的标准授权协议。在本文中,我们将介绍如何使用 Passport.js 在 Express.js 中实现 OAuth 认证。
什么是 Passport.js?
Passport.js 是一个 Node.js 的身份验证库,它提供了一种简单的方式来处理用户身份验证。它支持多种身份验证策略,包括本地身份验证、OAuth、OpenID 等。它还提供了易于使用的中间件,使得在 Express.js 应用程序中集成身份验证变得轻松简单。
什么是 OAuth?
OAuth 是一个授权框架,允许用户授权第三方应用程序访问他们在另一个服务上存储的信息,而无需提供他们的用户名和密码。OAuth 是一个安全的授权机制,因为用户不会直接将其凭据提供给第三方应用程序。
OAuth 有三个主要角色:
- 用户:拥有存储在服务提供商上的数据。
- 服务提供商(SP):存储用户数据的网站或应用程序。
- 应用程序(或客户端):希望访问用户数据的第三方应用程序。
在 OAuth 流程中,应用程序通过向服务提供商发出请求来请求访问用户数据。服务提供商会要求用户授权此请求。如果用户同意,服务提供商将向应用程序提供访问令牌,该令牌允许应用程序访问用户数据。
在 Express.js 中使用 Passport.js 实现 OAuth 认证
在下面的示例中,我们将使用 Passport.js 和 Express.js 实现 OAuth 认证。我们将使用 GitHub OAuth 作为示例。
步骤 1:安装 Passport.js 和相关模块
首先,我们需要安装 Passport.js 和相关模块。我们将使用以下命令安装它们:
npm install passport passport-github express-session
步骤 2:设置 GitHub 应用程序
在使用 GitHub OAuth 之前,我们需要在 GitHub 上创建一个 OAuth 应用程序。我们可以在 GitHub 的设置页面上创建一个新应用程序。在创建应用程序时,我们需要提供以下信息:
- 应用程序名称
- 主页 URL
- 授权回调 URL
授权回调 URL 是在用户授权后 GitHub 将用户重定向到的 URL。我们将在下一步中使用此 URL。
步骤 3:设置 Passport.js
接下来,我们需要设置 Passport.js。我们将在应用程序的入口文件中设置 Passport.js。在这个例子中,入口文件是 app.js
。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- -------------- - ------------------------------------ ----- ------- - --------------------------- -- -- ------ -- ---------------- ---------------- --------- ----------------- ------------- --------------------- ------------ -------------------------------------------- -- --------------------- ------------- -------- ----- - -- ----- ------ -- ---- -- ---------- ------------------------------------- ----- - ---------- ------ --- --------------------------------------- ----- - ---------- ------ --- -- ---- ----------------- ------- ----------------------- ------- ------ ------------------ ----- ---- ------------------------------- ----------------------------
在上面的代码中,我们首先导入 passport
、passport-github
和 express-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 认证路由 app.get('/auth/github', passport.authenticate('github')); app.get('/auth/github/callback', passport.authenticate('github', { failureRedirect: '/login' }), function(req, res) { res.redirect('/'); });
在上面的代码中,我们首先创建一个路由来处理 GitHub 认证。我们使用 passport.authenticate()
方法启用 GitHub 策略。这将重定向用户到 GitHub 授权页面。
接下来,我们创建一个回调路由来处理 GitHub 的回调。在回调函数中,我们使用 passport.authenticate()
方法处理 GitHub 认证结果。如果认证失败,我们将重定向用户到登录页面。否则,我们将重定向用户到主页。
步骤 5:保护路由
现在,我们已经设置了 GitHub 认证路由,我们需要保护某些路由。我们将在 app.js
中创建一个中间件来检查用户是否已经通过 GitHub 认证。
function ensureAuthenticated(req, res, next) { if (req.isAuthenticated()) { return next(); } res.redirect('/login'); }
在上面的代码中,我们创建了一个名为 ensureAuthenticated()
的中间件。如果用户已通过 GitHub 认证,该中间件将调用 next()
方法,否则将重定向用户到登录页面。
我们现在可以使用 ensureAuthenticated()
中间件来保护我们的路由:
app.get('/profile', ensureAuthenticated, function(req, res) { res.render('profile', { user: req.user }); });
在上面的代码中,我们创建了一个名为 /profile
的路由。我们使用 ensureAuthenticated()
中间件来保护此路由。如果用户已通过 GitHub 认证,我们将呈现 profile
视图,并将用户对象传递给视图。
结论
在本文中,我们介绍了如何使用 Passport.js 在 Express.js 中实现 OAuth 认证。我们使用 GitHub OAuth 作为示例,并提供了示例代码。要在应用程序中使用其他 OAuth 提供程序,请参阅该提供程序的文档。OAuth 是一种安全的授权协议,许多网站和应用程序都使用它来授权用户数据的访问。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675695b7d784fd63e2c65a08