【发布时间】:2021-01-12 05:05:40
【问题描述】:
您好,我对 nodejs 很陌生,这是我的第一个问题。我想将用户登录添加到我的快速服务器。所以我尝试了 passport.js 示例(express-4.x-local-example)。现在我尝试将用户存储在我的 sqlite 数据库中。我针对其他问题(node.js passport autentification with sqlite)。但这并没有解决我的问题。我不想用它创建一个实时应用程序,我只想了解它是如何工作的。当我将用户添加到我的数据库并尝试登录时,我总是被定向到 /bad。
这是我写的代码:
database.js
const sqlite3 = require("sqlite3");
const sqlite = require("sqlite");
const fs = require("fs").promises;
async function provideDatabase() {
const databaseExists = await fs
.access("./.data/database.db")
.catch(() => false);
const db = await sqlite.open({
filename: "./.data/database.db",
driver: sqlite3.Database
});
if (databaseExists === false) {
await db.exec(
"CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT, salt TEXT)"
);
}
return db;
}
module.exports = provideDatabase;
这是我的 server.js
var express = require('express');
var passport = require('passport');
var Strategy = require('passport-local').Strategy;
const provideDatabase = require("./database");
const database = provideDatabase();
const LocalStrategy = require('passport-local').Strategy
const bodyParser = require("body-parser");
var app = express();
app.use(bodyParser.json());
var crypto = require('crypto');
function hashPassword(password, salt) {
var hash = crypto.createHash('sha256');
hash.update(password);
hash.update(salt);
return hash.digest('hex');
}
passport.use(new LocalStrategy(async function(username, password, done) {
const db = await database;
db.get('SELECT salt FROM users WHERE username = ?', username, function(err, row) {
if (!row) return done(null, false);
var hash = hashPassword(password, row.salt);
db.get('SELECT username, id FROM users WHERE username = ? AND password = ?', username, hash, function(err, row) {
if (!row) return done(null, false);
return done(null, row);
});
});
}));
passport.serializeUser(function(user, done) {
return done(null, user.id);
});
passport.deserializeUser(async function(id, done) {
const db = await database;
db.get('SELECT id, username FROM users WHERE id = ?', id, function(err, row) {
if (!row) return done(null, false);
return done(null, row);
});
});
app.post('/login', passport.authenticate('local', { successRedirect: '/good',
failureRedirect: '/bad' }));
// Configure view engine to render EJS templates.
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
// Define routes.
app.get('/',
function(req, res) {
res.render('home', { user: req.user });
});
app.get('/login',
function(req, res){
res.render('login');
});
app.get('/logout',
function(req, res){
req.logout();
res.redirect('/');
});
app.get('/profile',
require('connect-ensure-login').ensureLoggedIn(),
function(req, res){
res.render('profile', { user: req.user });
});
app.get("/user", async (request, response) => {
const db = await database;
const results = await db.all("SELECT * FROM users");
response.send(results);
});
app.post("/user", async (request, response) => {
const db = await database;
hashedPassword = hashPassword(request.body.password, request.body.salt)
const created = await db.run(
"INSERT INTO users (username, password, salt) VALUES(?,?,?)",
request.body.username,
hashedPassword,
request.body.salt
);
const user = await db.get("SELECT * FROM users WHERE Id = ?", [
created.lastID
]);
response.status(201).send(user);
});
app.listen(3000);
【问题讨论】:
-
好像序列化有问题。如果您在
passport.deserializeUser函数中控制台日志row,输出是什么? -
当我将它添加到代码中时,我在控制台中没有得到任何输出。
-
只有在登录过程中才会触发该功能。所以尝试登录并查看控制台是否显示任何内容。
-
我试过这个,但唯一的输出是找不到 /bad 站点(我现在没有创建这个页面)。坏:1 GET localhost:3000/bad 404(未找到)
-
我只是想弄清楚是否正在调用序列化函数。它正在被调用,那么它可能是路由的问题。那么当你被重定向时,序列化函数是否被执行?
标签: node.js sqlite express passport.js