在开发 Web 应用程序时,我们通常需要一个用于用户认证的机制。Passport 是一个开源的用户认证工具,可以轻松地在 Node.js 应用程序中集成各种身份验证策略。在这篇文章中,我们将介绍如何在 Express.js 中使用 Passport 进行用户认证。
准备工作
在开始之前,我们需要确保已经安装了 Node.js,可以使用 npm 安装以下依赖项:
express:用于创建 Web 应用程序的框架
passport:使用它可以在 Node.js 应用程序中集成各种身份验证策略
passport-local:用于使用用户名和密码进行身份验证的 Passport 策略
mongoose:用于连接 MongoDB 数据库和进行数据建模的工具
bcrypt:用于将密码哈希的 Node.js 模块
安装命令如下:
npm install --save express passport passport-local mongoose bcrypt
创建应用程序
接下来,我们将创建一个 Express.js 应用程序,包括以下文件:
server.js
文件:服务端代码,启动服务器并配置路由passport-config.js
文件:配置我们的 Passport 身份验证策略user.js
文件:定义数据库模式来保存用户信息
server.js 文件
首先,我们将在 server.js 文件中定义基本的应用程序设置和路由。首先,我们必须对这些依赖项进行引用:
const express = require("express"); const mongoose = require("mongoose"); const passport = require("passport"); const session = require("express-session"); const app = express();
我们需要启用会话支持和中间件,以便 Passport 可以正常工作。我们将使用以下中间件:
-- -------------------- ---- ------- ------------------------ ---------------------------- --------- ---- ---- -------- --------- ------- --------- ------- ------ ------------------ ----- -- -- ------------------------------- ----------------------------
这里,我们正在将身份验证中间件添加到应用程序中。其中,secret
属性用于设置会话密码,resave
和 saveUninitialized
用于在会话中保存请求的数据。
接下来,我们将引用路由并启动服务器:
-- -------------------- ---- ------- ----------------- --------------------------------------------------- - ---------------- ----- ------------------- ---- -- -- -- - ---------------------- -- ---------- ---------------- -- -- - ------------------- ------- -- ---- ------- --- - -- ----- ---------- - ------------------------------- ---------------- ------------
在这里,我们为 authRoutes
定义了一个路由前缀,表示我们的身份验证路由将是 http://localhost:3000/auth
。在 authRoutes
中,我们将定义用户的注册、登录和注销路由,并且在 passport-config.js
文件中定义身份验证策略。
passport-config.js 文件
接下来,让我们在 passport-config.js
文件中定义我们的身份验证策略。
首先,我们需要引用必要的依赖项:
const passport = require("passport"); const LocalStrategy = require("passport-local").Strategy; const bcrypt = require("bcrypt"); const User = require("./models/user");
接下来,我们将使用 Passport 的本地策略(即用户名和密码)来验证用户的身份。我们将执行以下步骤:
认证过程:我们将通过本地策略验证用户的身份,并为其提供应用程序访问权限。
用户序列化:Passport 将使用序列化和反序列化功能来为已登录用户的存储会话。
-- -------------------- ---- ------- ------------- --- ------------------------ --------- ----- -- - -------------- --------- -------- -- ----- ----- -- - -- ----- - ------ ---------- - -- ------- - ------ ---------- ------ - -------- ---------- ---------- --- - ------------------------ -------------- ----- ---- -- - -- ----- - ------ ---------- ------ - ---- - ------ ---------- ------ - -------- ---------- ---------- --- - --- --- -- -- ----------------------------- ----- -- - ---------- --------- --- ----------------------------- ----- -- - ----------------- ----- ----- -- - --------- ------ --- ---
在这里,我们正在将本地策略添加到 Passport 中,使用 User.findOne
方法查找指定用户名的用户,然后使用 bcrypt 库与存储在数据库中的哈希密码进行比较。如果匹配成功,则 Passport 将用户传递到 done
方法作为已通过身份验证的用户。
接下来,我们使用 serializeUser
和 deserializeUser
方法定义如何将已登录用户存储在会话中。serializeUser
方法将已登录用户的 id 存储在 Passport 存储中,而 deserializeUser
方法将此 id 用于恢复用户对象。
user.js 文件
最后,我们需要定义数据库模式来保存用户信息。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ---------- - --- ----------------- --------- - ----- ------- --------- ---- -- --------- - ----- ------- --------- ---- - --- -------------- - ---------------------- ------------
注册、登录和注销
现在,我们已经设置了基本的应用程序和身份验证策略,让我们来看看如何使用 Passport 在 Express.js 中进行用户身份验证。
注册
当用户要注册新账户时,他们将访问 /auth/register
路由。在路由中,我们将使用 bcrypt
库将密码哈希,并将其保存在数据库中。
-- -------------------- ---- ------- ----- ------ - ------------------ ----- ---- - -------------------------- ------------------------ ----- ---- -- - ----- - --------- -------- - - --------- --------------------- --- ----- ----- -- - -- ----- - ----------------- -------------------------- - ----- ---- - --- ------ --------- --------- --------- ---- --- --------------- -- - -- ----- - ----------------- -------------------------- - ---- - ------------------ - --- --- ---
在这里,我们使用 bcrypt
库对密码进行哈希处理,使用 User
模型将打包并保存用户数据,会在成功保存用户后重定向到应用程序的主页中。
登录
在用户输入了正确的用户名和密码之后,它们将访问 /auth/login
路由来进行身份验证。在这里,我们将使用 passport.authenticate
方法来验证用户的用户名和密码是否正确。如果匹配成功,则用户将被重定向到 /
路由,即应用程序的主页。否则,他们将被重定向到 /auth/login
路由。
router.post( "/login", passport.authenticate("local", { successRedirect: "/", failureRedirect: "/auth/login" }) );
注销
最后,让我们来看看如何使用 Passport 注销用户。这里我们简单地使用 req.logout
方法将其从会话中清除。
router.get("/logout", (req, res) => { req.logout(); res.redirect("/"); });
结论
在此示例中,我们使用了 Passport 本地策略来验证用户的用户名和密码。Passport 支持多种身份验证策略,如 OAuth、OpenID 等。Passport 使用户身份验证非常简单,以便您可以专注于更加深入的 Web 应用程序开发。
完整代码如下:
server.js
文件
-- -------------------- ---- ------- ----- ------- - ------------------- ----- -------- - -------------------- ----- -------- - -------------------- ----- ------- - --------------------------- ----- --- - ---------- ------------------------ ---------------------------- --------- ---- ---- -------- --------- ------- --------- ------- ------ ------------------ ----- -- -- ------------------------------- ---------------------------- ----------------- --------------------------------------------------- - ---------------- ----- ------------------- ---- -- -- -- - ---------------------- -- ---------- ---------------- -- -- - ------------------- ------- -- ---- ------- --- - -- ----- ---------- - ------------------------------- ---------------- ------------
passport-config.js
文件
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ----- ------ - ------------------ ----- ---- - ------------------------- ------------- --- ------------------------ --------- ----- -- - -------------- --------- -------- -- ----- ----- -- - -- ----- - ------ ---------- - -- ------- - ------ ---------- ------ - -------- ---------- ---------- --- - ------------------------ -------------- ----- ---- -- - -- ----- - ------ ---------- ------ - ---- - ------ ---------- ------ - -------- ---------- ---------- --- - --- --- -- -- ----------------------------- ----- -- - ---------- --------- --- ----------------------------- ----- -- - ----------------- ----- ----- -- - --------- ------ --- ---
user.js
文件
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ---------- - --- ----------------- --------- - ----- ------- --------- ---- -- --------- - ----- ------- --------- ---- - --- -------------- - ---------------------- ------------
authRoutes.js
文件
-- -------------------- ---- ------- ----- ------- - ------------------- ----- -------- - -------------------- ----- ------ - ----------------- ------------------------ ----- ---- -- - ----- - --------- -------- - - --------- --------------------- --- ----- ----- -- - -- ----- - ----------------- -------------------------- - ----- ---- - --- ------ --------- --------- --------- ---- --- --------------- -- - -- ----- - ----------------- -------------------------- - ---- - ------------------ - --- --- --- ------------ --------- ------------------------------ - ---------------- ---- ---------------- ------------- -- -- --------------------- ----- ---- -- - ------------- ------------------ --- -------------- - -------
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67293d162e7021665e234726