在现代 Web 应用中,身份验证和授权是非常重要的安全机制。Passport.js 是一个 Node.js 的身份验证中间件,它可以轻松地与 Express.js 应用集成,提供了多种身份验证策略,包括本地验证、OAuth、OpenID 等。
本文将介绍如何使用 Passport.js 实现 Express.js 应用的身份验证和授权,包括使用本地验证策略和第三方 OAuth2.0 验证策略。
安装 Passport.js
首先,我们需要安装 Passport.js 和相关的策略。可以使用 npm 来安装:
npm install passport passport-local passport-oauth2
使用本地验证策略
本地验证是最基本的身份验证方式,用户只需要提供用户名和密码即可登录。Passport.js 提供了 passport-local 策略来实现本地验证。
配置 Passport.js
首先,我们需要在 Express.js 应用中配置 Passport.js。在 app.js 或者 index.js 中添加以下代码:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- ------------- - ---------------------------------- -- -------- ---------------- -------------- ------------------ --------- ----- - -- -------------- -- --------- --- ------- -- -------- --- -------- - ------ ---------- - --------- ------- -- - ---- - ------ ---------- ------ - -------- ---------- -------- -- ---------- -- - - -- -- ----------------- ------------------------------------- ----- - ---------- ----- -- --------------------------------------- ----- - ---------- ----- --
以上代码中,我们使用 passport-local 策略创建了一个本地验证策略,其中的回调函数用于验证用户提供的用户名和密码。在这个例子中,我们只是简单地将用户名和密码设置为 'admin',但是在实际应用中,我们需要连接数据库并查询用户信息来进行验证。
我们还需要配置序列化和反序列化用户信息的方法,这两个方法用于在用户登录后将用户信息存储到 session 中,以及在用户每次请求时从 session 中获取用户信息。
配置 Express.js
在 Express.js 中,我们需要使用 session 中间件和 Passport.js 中间件来处理身份验证和授权。在 app.js 或者 index.js 中添加以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- ------- - -------------------------- ----- -------- - ------------------- ----- --- - --------- ----------------- ------- --------- ----- ------- ------ ------------------ ----- --- ------------------------------ ---------------------------
以上代码中,我们使用 express-session 中间件来处理 session,并使用 Passport.js 中间件来处理身份验证和授权。
创建登录和登出路由
接下来,我们需要创建登录和登出路由。在 routes 目录下创建 auth.js 文件,并添加以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- -------- - ------------------- ----- ------ - ---------------- -------------------- ------------- ---- - ------------------- -- --------------------- ------------------------------ - ---------------- ---- ---------------- --------- ------------- ---- --- --------------------- ------------- ---- - ------------ ----------------- -- -------------- - ------
以上代码中,我们创建了三个路由:/login、/logout 和 /login POST。/login 路由用于渲染登录页面,/login POST 路由用于处理用户登录请求,/logout 路由用于处理用户退出登录请求。
在 /login POST 路由中,我们使用 passport.authenticate 方法来进行身份验证,其中第一个参数是验证策略的名称,这里我们使用了 passport-local 策略。如果验证成功,则重定向到首页;如果验证失败,则重定向到登录页面,并显示错误信息(使用了 connect-flash 中间件来实现)。
在 /logout 路由中,我们使用 req.logout 方法来退出登录,并重定向到首页。
创建首页路由
最后,我们需要创建首页路由,用于显示用户信息和授权状态。在 routes 目录下创建 index.js 文件,并添加以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- -------- - ------------------- ----- ------ - ---------------- --------------- ------------- ---- - ------------------- - ----- -------- -- -- -------------- - ------
以上代码中,我们创建了一个 / 路由,用于渲染首页。在渲染页面时,我们使用了 req.user 对象来获取当前登录用户的信息。
创建视图
最后,我们需要创建视图文件。在 views 目录下创建 login.ejs、index.ejs 文件,并添加以下代码:
login.ejs:
-- -------------------- ---- ------- -------------- -- -- ---------------- - -- ---- ------------ ----------------- -------------- -------- -- - -- ----- ------------- ---------------- ---- ------------------- ------ ------------------------------- ------ ----------- -------------------- ------------- ---------------- ------ ---- ------------------- ------ ------------------------------- ------ --------------- -------------------- ------------- ---------------- ------ ------- ------------- ---------- --------------------------- -------
index.ejs:
<h1>Home</h1> <% if (user) { %> <p>Welcome <%= user.username %>!</p> <a href="/logout">Logout</a> <% } else { %> <a href="/login">Login</a> <% } %>
以上代码中,我们创建了两个视图文件:login.ejs 和 index.ejs。login.ejs 用于渲染登录页面,index.ejs 用于渲染首页。在 index.ejs 中,我们使用了 req.user 对象来判断当前用户是否已经登录,并显示相应的内容。
使用 OAuth2.0 验证策略
OAuth2.0 是一种常用的第三方身份验证和授权机制,它可以让用户使用第三方账号登录我们的应用。Passport.js 提供了多种 OAuth2.0 验证策略,包括 Google、Facebook、Twitter 等。
配置 Passport.js
在 Passport.js 中配置 OAuth2.0 策略非常简单,只需要调用 passport.use 方法,并传入相应的策略即可。以 Google OAuth2.0 策略为例:
-- -------------------- ---- ------- ----- -------------- - ------------------------------------------- ---------------- ---------------- --------- ----------------- ------------- --------------------- ------------ -------------------------------------------- -- --------------------- ------------- -------- ----- - -- --------------- ---------- -------- - --
以上代码中,我们创建了一个 Google OAuth2.0 策略,并传入了相应的参数。在回调函数中,我们可以获取到用户的访问令牌、刷新令牌和用户信息,并进行相应的处理和验证。
配置 Express.js
在 Express.js 中,我们需要创建相应的路由来处理 OAuth2.0 认证请求和回调请求。以 Google OAuth2.0 策略为例:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- -------- - ------------------- ----- ------ - ---------------- --------------------- ------------------------------- - ------ ----------- --- ------------------------------ ------------------------------- - ---------------- -------- --- ------------- ---- - -- ------------- ----------------- - - -------------- - ------
以上代码中,我们创建了两个路由:/auth/google 和 /auth/google/callback。/auth/google 路由用于发起 Google OAuth2.0 认证请求,/auth/google/callback 路由用于处理 Google OAuth2.0 回调请求。
在 /auth/google 路由中,我们使用 passport.authenticate 方法来发起 Google OAuth2.0 认证请求,并传入相应的参数。在这个例子中,我们只请求了用户的 profile 信息。
在 /auth/google/callback 路由中,我们使用 passport.authenticate 方法来处理 Google OAuth2.0 回调请求,并传入相应的参数。如果认证成功,则重定向到首页;否则重定向到登录页面。
创建视图
最后,我们需要创建相应的视图文件。在 views 目录下创建 login.ejs 文件,并添加以下代码:
<h1>Login</h1> <a href="/auth/google" class="btn btn-danger">Login with Google</a>
以上代码中,我们创建了一个链接,用于发起 Google OAuth2.0 认证请求。
总结
本文介绍了如何使用 Passport.js 实现 Express.js 应用的身份验证和授权,包括使用本地验证策略和第三方 OAuth2.0 验证策略。身份验证和授权是 Web 应用的重要组成部分,通过使用 Passport.js,我们可以轻松地实现这些功能,并提高应用的安全性和可靠性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6512265195b1f8cacda920f0