登录后如何使护照中的deserializeUser功能不断运行?

时间:2017-09-28 04:03:52

标签: node.js postgresql reactjs express authentication

我的用户身份验证遇到了一些问题。我可以登录,注册和注销,你可以从客户端想到一切都很棒。但是,我的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 };

0 个答案:

没有答案