如何让我的deserializeUserfunction在护照login后不断运行?
我用我的用户身份validation有一些麻烦。 我可以login,注册和注销,您可以从客户端认为一切都很好。 但是,我的反序列化用户函数被重复调用。 每秒几十次。 我最初并没有注意到,但是如果你login了足够长的时间,应用程序真的变慢了。 我似乎无法弄清楚。 任何帮助将不胜感激。
另外,我试过在user.js文件的末尾运行client.end(),但是这并没有解决问题。 我想知道这是不是一个交叉来源的问题。
-UPDATE – 我不怀疑这是一个CORS问题,因为我刚刚尝试从服务器端口上的静态HTML文件login,问题依然存在。
*在与服务器不同的端口上运行的前端进行响应。 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 };
- 如何使用Passport保护路线终点?
- 具有Express和Mongoose的BasicAuth
- 基于令牌的身份validation和在Nodejs中的Facebook身份validation
- 什么时候是序列化和反序列化的护照方法? 它究竟设置了什么?
- 使用passport.js在node.js中进行身份validation后,redirect到上一页
- 使用HTTP基本身份validation保护API
- InternalOAuthError:无法获取访问令牌
- 是否有一个node.js框架提供像spring-security一样的授权和authentication?
- PHP – 计算正确的HMAC签名为nodejs脚本