我的用户身份验证遇到了一些问题。我可以登录,注册和注销,你可以从客户端想到一切都很棒。但是,我的deserializeUser函数被重复调用。每秒几十次。我最初没有注意到它,但如果你登录的时间足够长,应用程序真的会慢下来。我似乎无法弄明白。任何帮助将不胜感激。
另外,我已经尝试在user.js文件的末尾运行client.end(),但这并没有解决问题。我想知道它是否是一个跨领域问题。
-UPDATE - 我不怀疑它是一个CORS问题,因为我刚尝试从服务器端口上的静态html文件登录,问题仍然存在。
*在与服务器不同的端口上运行的前端上进行反应。服务器端的Node,Express和Postgres。
app.js
const express = require('express'),
app = express(),
bodyParser = require('body-parser'),
cookieParser = require('cookie-parser'),
expressValidator = require('express-validator'),
passport = require('passport'),
session = require('express-session');
require('dotenv').config();
let port = process.env.PORT || 5000;
app.use((req, res, next) => {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', 'http://localhost:3000');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
app.use(express.static('public'));
app.use(cookieParser('brothersofgroove'));
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(session({
secret: 'brothersofgroove',
resave: false,
saveUninitialized: false,
path:"/*" //NEEDED
}));
app.use(passport.initialize());
app.use(passport.session());
require('./passportconfig').configure(passport);
app.use('/', require('./routes/auth'));
app.use('/', require('./routes/general'));
app.listen(port, () => {
console.log(`Your server is running on PORT ${ port }.`);
})
passportconfig.js
const LocalStrategy = require('passport-local').Strategy;
const { Client } = require('pg');
const User = require('./models/user');
function configure(passport) {
const strategyFunc = function(username, password, done) {
User.checkUser(username, password, function(err, user) {
if (err) {
console.log('Local Strategy - Error trying to authenticate.');
done(err);
} else if (user) {
console.log('Local Strategy - Success');
done(null, user);
} else {
console.log('Local Strategy - Could not find user');
done(null, false);
};
});
};
passport.use(new LocalStrategy(strategyFunc));
passport.serializeUser(function(user, done) {
console.log('serializeUser', user);
done(null, user);
});
passport.deserializeUser(function(user, done) {
console.log('deserializeUser', user);
const userId = user.id;
const client = new Client();
client.connect().then(() => {
const sql = 'SELECT * FROM backbeatuser WHERE id = $1';
const params = [userId];
return client.query(sql, params);
}).then((results) => {
const user = results.rows[0];
done(null, user);
}).catch((err) => {
throw err;
}).then(() => {
client.end();
});
});
};
module.exports = { configure };
auth.js
const express = require('express'),
bcrypt = require('bcryptjs'),
{ Client } = require('pg'),
passport = require('passport'),
router = express.Router();
const User = require('../models/user');
router.post('/login', passport.authenticate('local', {
successRedirect: '/backbeat',
failureRedirect: '/notloggedin',
failureFlash: true
}));
router.post('/signup', (req, res, next) => {
const firstName = req.body.firstName,
lastName = req.body.lastName,
email = req.body.email,
username = req.body.username,
password = req.body.password,
city = req.body.city,
skillLevel = req.body.skillLevel;
const salt = bcrypt.genSaltSync(10);
const passwordHash = bcrypt.hashSync(password, salt);
const client = new Client();
client.connect().then(() => {
const sql = `
INSERT INTO backbeatuser
(first_name, last_name, email, username, password_hash, city, skill_level, onboarding_stage)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
RETURNING *
`;
let params = [firstName, lastName, email, username, passwordHash, city, skillLevel, 0];
params = params.map((param) => {
if (param === '') {
param = null;
};
return param;
});
return client.query(sql, params);
}).then((results) => {
const user = results.rows[0];
}).then(() => {
next();
}).catch((err) => {
res.redirect('/');
}).then(() => {
client.end();
});
}, passport.authenticate('local', {
successRedirect: '/backbeat'
}));
router.post('/logout', (req, res) => {
req.logout();
// res.redirect('/');
});
module.exports = router;
user.js的
const bcrypt = require('bcryptjs'),
{ Client } = require('pg');
const checkPassword = function(password, passwordHash) {
return bcrypt.compareSync(password, passwordHash);
}
const checkUser = function(username, password, done) {
const client = new Client();
client.connect().then(() => {
const sql = 'SELECT * FROM backbeatuser WHERE username = $1';
const params = [username];
return client.query(sql, params);
}).then((results) => {
console.log('username results', results.rows);
const user = results.rows[0];
if (user && checkPassword(password, user.password_hash)) {
console.log('Should be a successful login');
done(null, user);
} else {
console.log('The user probably entered the incorrect password');
done(null, false);
};
});
};
module.exports = { checkUser };