📅  最后修改于: 2023-12-03 15:41:25.351000             🧑  作者: Mango
Node.js 护照是一个基于 Node.js 的身份验证中间件,可以简化应用程序中的账户验证流程。SQLite 是一种轻量级的数据库管理系统,它可被集成到 Node.js 应用程序中,用于在本地管理数据。
本文将介绍如何将 Node.js 护照和 SQLite 结合使用以实现本地账户验证。
为了跟随本文的步骤,您需要已经具备以下条件:
在开始编写代码之前,我们需要先安装以下依赖:
您可以使用 npm(Node.js 包管理器)来安装这些依赖。在命令行中运行以下命令:
npm install passport passport-local express sqlite3
在本文中,我们将使用以下 SQLite 表(users)来存储本地用户:
| id (INT PRIMARY KEY) | username (TEXT) | password (TEXT) | |----------------------|----------------|-----------------| | 1 | john | password1 | | 2 | jane | password2 |
您可以使用 SQLite 命令行或 SQLite 可视化工具(如 DB Browser for SQLite)来创建此表。创建完成后,您可以将其保存在项目根目录中(将其命名为“users.db”)。
在 Node.js 中,可以使用 Passport 和 Passport-Local 策略来配置本地身份验证。首先,我们需要在 app.js 文件(或另一个主要文件)中导入所需的模块,并设置 Passport 的会话。
const express = require('express');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const sqlite3 = require('sqlite3').verbose();
const app = express();
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
app.use(passport.initialize());
app.use(passport.session());
接下来,我们需要设置 Passport 本地策略。在我们的示例中,我们将使用 SQLite 数据库来验证用户。
passport.use(new LocalStrategy(
function (username, password, done) {
const db = new sqlite3.Database('./users.db');
db.get('SELECT * FROM users WHERE username = ?', [username], (err, row) => {
if (!row) { return done(null, false); }
if (row.password !== password) { return done(null, false); }
return done(null, row);
});
}
));
在上面的代码中,我们向 LocalStrategy 提供了一个回调函数。此函数接收用户名和密码,检查它们是否与 SQLite 数据库中的记录匹配。
最后,我们需要配置 Passport 序列化和反序列化功能:
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
const db = new sqlite3.Database('./users.db');
db.get('SELECT * FROM users WHERE id = ?', [id], (err, row) => {
done(null, row);
});
});
上述代码将用户 ID 序列化为会话中的 cookie,以在后续验证中使用。反序列化过程将使用该 ID 来从 SQLite 数据库中检索用户数据。
我们可以将 Passport 设置为在路由中执行身份验证。首先,我们需要创建登录和注销路由。
app.get('/login', function (req, res) {
res.sendFile(__dirname + '/login.html');
});
app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));
app.get('/logout', function (req, res) {
req.logout();
res.redirect('/login');
});
在上面的代码中,我们向 '/login'
路由发送 HTML 文件,在文件中为用户提供用户名和密码输入字段。在用户提交表单后,我们会使用 passport.authenticate
函数来验证用户。如果验证成功,我们将重定向用户到主页('/'
)。如果验证失败,我们将重定向用户到登录页面('/login'
)。
我们还创建了 '/logout'
路由,当触发该路由时,将断开用户的会话并重定向到登录页面。
最后,我们需要创建一个需要身份验证才能访问的受保护路由:
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) { return next(); }
res.redirect('/login');
}
app.get('/', ensureAuthenticated, function (req, res) {
res.sendFile(__dirname + '/index.html');
});
上面的代码中,我们创建了 ensureAuthenticated
函数以确保用户已通过身份验证。如果用户已通过身份验证,则将其重定向到主页;否则,将其重定向到登录页面。
所有设置完成后,我们可以在命令行中启动应用程序:
node app.js
运行该命令后,我们可以在浏览器中输入 http://localhost:3000
访问我们的应用程序,该应用程序仅允许已经通过身份验证的用户才能访问。
在本文中,我们介绍了如何将 Node.js 护照和 SQLite 结合使用以实现本地账户验证。通过结合 Passport 和 SQLite 驱动程序,我们可以轻松地实现本地身份验证并创建一个安全的 Web 应用程序。