前言
在现代 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:
npm install passport --save
同时安装您所需的身份验证策略,例如:
npm install passport-local --save npm install passport-google-oauth --save
这里我们使用了两个策略:本地身份验证和 Google OAuth。
2. 配置 Passport.js
在您的 Express.js 应用程序中引入 Passport.js:
const passport = require('passport'); const LocalStrategy = require('passport-local').Strategy; const GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; app.use(passport.initialize()); app.use(passport.session());
稍后我们将详细讲解如何配置一些常用的身份验证策略。
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)。然后,在反序列化期间,它将使用该标识符重新检索用户对象。因此,您需要在您的应用程序中实现序列化和反序列化方法。
passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { // 从存储区域获取用户 done(null, user); });
在上述代码中,我们编写了一个简单的序列化函数,它使用用户 ID 作为标识符。在反序列化期间,我们检索存储区域中的用户并将其传递给 done 函数。这样,Passport.js 知道如何将请求附加到正确的用户记录上。
6. 使用 Passport.js
现在您已经完成了 Passport.js 的设置和配置,接下来我们将学习如何在 Express.js 中实现身份认证。
登录
要登录,您需要为请求启用 Passport.js,然后使用 authenticate 方法来执行身份验证。对于本地身份验证,您可以使用以下代码:
app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));
在上述代码中,我们使用 authenticate 方法来执行身份验证。如果身份验证成功,则用户将被重定向到根路径,否则将重定向到登录页面。
对于 Google OAuth,您可以使用以下代码:
app.get('/auth/google', passport.authenticate('google', { scope: ['profile'] })); app.get('/auth/google/callback', passport.authenticate('google', { successRedirect: '/', failureRedirect: '/login' }));
在上述代码中,我们首先定义一个可以发送到 Google 的地址,以获取用户名和密码。然后,在用户返回应用程序时,我们通过回调地址接收数据。之后,我们使用 authenticate 方法来执行身份验证,如果身份验证失败,则将用户重定向到登录页面。
保护路由和 API
现在您已经知道如何登录,接下来我们将学习如何保护某些路由和 API。
要保护路由,您可以使用以下代码:
-- -------------------- ---- ------- ------------------- ----------- ------------- ---- - ---------------------- --- -------- --------------- ---- ----- - -- ----------------------- ------ ------- ----------------------- -
在上述代码中,我们首先定义了一个名为 isLoggedIn 的函数,并检查用户是否已经通过身份验证。如果已经验证,则允许用户继续,否则将用户重定向到登录页面。
对于 API,您可以使用以下代码:
app.get('/api/user', passport.authenticate('basic', { session: false }), function(req, res) { res.json({ id: req.user.id, username: req.user.username }); });
在上述代码中,我们定义了一个基本身份验证策略,并将其传递给 authenticate 方法。基本身份验证使用 HTTP 标头传输用户名和密码,在本例中,我们使用了一个简单的基本身份验证策略来保护 /api/user 路由。
结论
在这篇文章中,我们介绍了如何在 Express.js 中使用 Passport.js 来实现身份认证。我们详细介绍了如何配置 Passport.js 和实现不同类型的身份验证策略。我们还讨论了如何保护路由和 API,以确保您的应用程序和数据得到充分的保护。
Passport.js 是一个非常强大和灵活的身份验证中间件,您可以选择自己需要的身份验证策略以满足您的应用程序需求。因此,我鼓励您在实践中进行尝试,并探索更多的身份认证策略和功能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67165eb0ad1e889fe21c39e2