📜  节点 js 护照本地用于 sqlite (1)

📅  最后修改于: 2023-12-03 15:41:25.351000             🧑  作者: Mango

使用 Node.js 护照本地用于 SQLite

简介

Node.js 护照是一个基于 Node.js 的身份验证中间件,可以简化应用程序中的账户验证流程。SQLite 是一种轻量级的数据库管理系统,它可被集成到 Node.js 应用程序中,用于在本地管理数据。

本文将介绍如何将 Node.js 护照和 SQLite 结合使用以实现本地账户验证。

准备工作

为了跟随本文的步骤,您需要已经具备以下条件:

  • 安装了 Node.js 并可在命令行中使用
  • 一定的 JavaScript 和 Node.js 知识
  • 知道什么是 SQLite,并了解如何在 Node.js 中使用它
安装依赖

在开始编写代码之前,我们需要先安装以下依赖:

  1. passport - Node.js 的身份认证中间件
  2. passport-local - 用于处理本地身份验证的 Passport 策略
  3. express - Node.js 的 Web 框架
  4. sqlite3 - SQLite 的官方 Node.js 驱动程序

您可以使用 npm(Node.js 包管理器)来安装这些依赖。在命令行中运行以下命令:

npm install passport passport-local express sqlite3
创建 SQLite 数据库

在本文中,我们将使用以下 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 应用程序。