Node.js + Express.js + Passport.js :在服务器重新启动之间保持身份验证

作者:编程家 分类: 编程代码 时间:2025-09-13

在开发Web应用程序时,用户身份验证是一个非常重要的功能。通过身份验证,我们可以确保只有授权的用户能够访问敏感的数据或执行特定的操作。但是,当服务器重新启动时,通常会导致用户的身份验证失效,需要重新登录。这对于用户来说可能是一个不便,因此我们需要一种方法来在服务器重新启动之间保持身份验证状态。

为了实现这个目标,我们可以使用Node.js作为后端框架,Express.js作为Web应用程序框架,以及Passport.js作为身份验证中间件。Node.js是一个基于事件驱动的JavaScript运行时环境,可以在服务器端运行JavaScript代码。Express.js是一个简洁而灵活的Web应用程序框架,可以帮助我们快速构建Web应用程序。Passport.js是一个身份验证中间件,可以集成到Express.js中,提供了各种身份验证策略(如用户名密码、社交媒体登录等)。

首先,我们需要安装所需的依赖包。打开终端并进入项目目录,然后运行以下命令:

npm install express passport passport-local express-session

接下来,我们可以创建一个名为`app.js`的文件,并在其中编写我们的Node.js应用程序。首先,我们需要引入所需的模块:

javascript

const express = require('express');

const passport = require('passport');

const session = require('express-session');

const LocalStrategy = require('passport-local').Strategy;

然后,我们可以设置Express.js应用程序的配置:

javascript

const app = express();

app.use(express.urlencoded({ extended: true }));

app.use(express.json());

app.use(session({

secret: 'secret',

resave: false,

saveUninitialized: false

}));

app.use(passport.initialize());

app.use(passport.session());

配置Passport.js本地策略

接下来,我们可以配置Passport.js本地策略。本地策略使用用户名和密码进行身份验证。我们需要提供一个回调函数,该函数将在用户登录时调用,并验证用户提供的凭据。

javascript

passport.use(new LocalStrategy(

function(username, password, done) {

// 在这里进行用户名和密码的验证

// 如果验证成功,调用 done(null, user)

// 如果验证失败,调用 done(null, false)

}

));

接下来,我们需要配置序列化和反序列化用户对象。序列化用户对象是将用户对象转换为唯一标识符的过程,而反序列化是将唯一标识符转换回用户对象的过程。这对于在每个请求中存储用户对象非常有用。

javascript

passport.serializeUser(function(user, done) {

done(null, user.id);

});

passport.deserializeUser(function(id, done) {

// 根据唯一标识符查找用户对象

done(null, user);

});

实现登录和保持身份验证状态

现在,我们可以实现登录和保持身份验证状态的功能。我们可以为`/login`路由添加一个POST请求处理程序,该处理程序将使用Passport.js的`passport.authenticate`方法来验证用户的凭据。

javascript

app.post('/login', passport.authenticate('local'), function(req, res) {

// 登录成功后的处理

res.redirect('/dashboard');

});

在上面的代码中,我们使用本地策略进行身份验证,并在验证成功后将用户重定向到`/dashboard`页面。

为了保持身份验证状态,我们可以使用`req.isAuthenticated()`方法来检查用户是否已经通过身份验证。如果已经通过身份验证,我们可以继续处理请求,否则我们可以将用户重定向到登录页面。

javascript

app.get('/dashboard', function(req, res) {

if (req.isAuthenticated()) {

// 在这里处理已经通过身份验证的用户请求

} else {

res.redirect('/login');

}

});

在服务器重新启动之间保持身份验证状态

为了在服务器重新启动之间保持身份验证状态,我们可以使用MongoDB或其他数据库来存储用户会话信息。在每次用户登录时,我们可以将会话信息存储在数据库中,并为每个会话分配一个唯一标识符。当用户进行请求时,我们可以使用唯一标识符来检索会话信息,并验证用户的身份。

以下是将会话信息存储在MongoDB中的示例代码:

javascript

const mongoose = require('mongoose');

const sessionSchema = new mongoose.Schema({

sessionId: String,

userId: String

});

const Session = mongoose.model('Session', sessionSchema);

app.post('/login', passport.authenticate('local'), function(req, res) {

const sessionId = req.session.id;

const userId = req.user.id;

Session.create({ sessionId, userId }, function(err, session) {

if (err) {

console.log(err);

}

res.redirect('/dashboard');

});

});

app.get('/dashboard', function(req, res) {

const sessionId = req.session.id;

Session.findOne({ sessionId }, function(err, session) {

if (err) {

console.log(err);

}

if (session && session.userId === req.user.id) {

// 在这里处理已经通过身份验证的用户请求

} else {

res.redirect('/login');

}

});

});

在上面的代码中,我们创建了一个名为`Session`的模型,用于存储会话信息。在用户登录时,我们创建一个新的会话,并将会话信息存储在数据库中。在每个请求中,我们检索会话信息,并验证用户的身份。

结束语

通过使用Node.js + Express.js + Passport.js,我们可以在服务器重新启动之间保持用户的身份验证状态。这样,用户可以在重新启动后继续访问受保护的资源,而无需重新登录。这为用户提供了更好的用户体验,并提高了应用程序的安全性。

在本文中,我们介绍了如何使用Passport.js实现身份验证,并使用MongoDB存储会话信息。这只是一个基本的示例,你可以根据自己的需求进行扩展和定制。希望本文对你有所帮助,祝你在开发Web应用程序时取得成功!