简体   繁体   中英

Passport.js's req.isAuthenticated() always return false

Thats my code: server.js:

require('dotenv').config()

var fs = require('fs')
var express = require('express')
var app = express()
var helmet = require('helmet')
var router = require('./router')
var session = require('express-session')
var passport = require('passport')
var cookie = require('cookie-parser')
var redis = require('redis').createClient(process.env.REDIS_PORT)
var redisStore = require('connect-redis')(session)

app.use(helmet())
app.use(cookie())
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
app.use(passport.initialize())
app.use(passport.session())
app.use(session({
    store: new redisStore({client: redis}),
    secret: 'rior124jybtyokipoev5432rtoe34wpta',
    cookie: {
        path: '/',
        httpOnly: true,
        maxAge: 1000*60*60*24*365,
        secure: false
    },
    resave: false,
    saveUninitialized: false
}))
app.use(router)

require('./config/passport');

app.listen(process.env._PORT, () => {
    console.log('[Info][Backend] Backend http serve succesfuly started! Port: '+process.env._PORT);
})

router/index.js:

var router = require('express').Router()
var auth = require('../lib/auth_mw')
var fs = require('fs')

router.use(require('./logging'))
router.use(require('./news'))

router.get('/', (req, res) => {
    res.contentType('text/plain')
    res.end(fs.readFileSync(__dirname+'/../siteinfo.txt'))
})

router.get('/private', auth, (req, res) => {
    res.end('private')
})

module.exports = router

config/passport.js:

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
var users = require('../models').users

passport.serializeUser(function(user, done) {
  console.log('serialize: ', user);
  done(null, user.email);
});

passport.deserializeUser(function(email, done) {
  console.log('deserialize: ', email);
  users.findOne({
    attributes: [
      'email'
    ],
    where: {
      email
    }
  }).then(user => {    
    done(null, user.email === email ? user.dataValues : false);
  })
});

passport.use('local',
  new LocalStrategy({ usernameField: 'email' }, async function(
    email,
    password,
    done
  ) {
    let user = await users.findOne({
      attributes: [
        'email',
        'password'
      ],
      where: {
        email,
        password
      }
    })

    if (user.dataValues.email) {
      return done(null, user.dataValues);
    } else {
      return done(null, false);
    }
  })
);

Login always succesfull, but when i'm trying to go to /private, deserialize function doesn't called, I found many resolves on the.net. but doesn't help, Please, suggest as many resolves as you know

PS I use sequelize as a database driver (idk maybe it's important)

This query will return the correct user, So You don't need to check the output again.

users.findOne({
  attributes: [
    'email'
  ],
  where: {
    email
  }
})

Try done(null, user.dataValues); instead of done(null, user.email === email? user.dataValues: false);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM