Паспорт. js req.isAuthenticated () всегда возвращает false - PullRequest
0 голосов
/ 23 апреля 2020

Вот мой код: сервер. 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);
})

маршрутизатор / индекс. 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);
    }
  })
);

Вход в систему всегда успешен, но когда я пытаюсь go перейти в / private, функция десериализации не вызывается! Я нашел много разрешений на net, но это не помогает. Пожалуйста, предложите столько раз, сколько вам известно

PS Я использую sequelize в качестве драйвера базы данных (idk, может быть, это важно)

1 Ответ

0 голосов
/ 24 апреля 2020

Этот запрос вернет правильного пользователя, поэтому вам не нужно снова проверять вывод.

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

Попробуйте done(null, user.dataValues); вместо done(null, user.email === email ? user.dataValues : false);

...