Я работаю над экспресс-сервером, который использует стратегии паспорта-локального и google-oauth2 с сеансом cookie для аутентификации. Стратегия google-oauth отлично работает на 100% без проблем. Но моя локальная стратегия возвращает req.user undefined ... а req.session возвращает паспорт, за которым следует пустой объект. Это сразу после успешного перехода по маршруту successRedirect !? Как будто пользователь мгновенно выходит из системы ...
Я использовал несколько console.infos, чтобы попытаться как можно лучше следить за ходом стратегии, но не нашел критической точки (найдите прикрепленную ссылку на изображение журналов терминала). журналы терминала img
код следует ...
сервер / index.js
import 'babel-polyfill'
import express from 'express'
import mongoose from 'mongoose'
import cookieSession from 'cookie-session'
import passport from 'passport'
import bodyParser from 'body-parser'
// Import User model / making schema globaly available
import './models/User'
// Import Routes
import userRoutes from './routes/api/user'
import localAuthRoutes from './routes/auth/local'
import googleAuthRoutes from './routes/auth/google'
// Import Strategies
import './services/passportGoogle'
import './services/passportLocal'
// Config Keys
import keys from './config/keys'
mongoose.Promise = global.Promise
// Connect to Mongodb
mongoose
.connect(
keys.mongoURI,
{ useMongoClient: true }
)
.then(() => console.info('MongoDB wired up'))
.catch(err => console.info(err))
// Run Express
const app = express()
// Middleware
app.use(bodyParser.json())
// Passport config
app.use(
cookieSession({
name: 'session',
maxAge: 30 * 24 * 60 * 60 * 1000,
keys: [keys.cookieKey]
})
)
app.use(passport.initialize())
app.use(passport.session())
// Use Routes
userRoutes(app)
localAuthRoutes(app)
googleAuthRoutes(app)
app.listen(5000, () => {
console.info('Server monitoring port 5000')
})
сервер / маршруты / аутентификация / local.js
import mongoose from 'mongoose'
import passport from 'passport'
import gravatar from 'gravatar'
import keys from '../../config/keys'
import validateRegisterInput from '../../validation/register'
import validateLoginInput from '../../validation/login'
// Import User Model
const User = mongoose.model('User')
module.exports = app => {
// @route POST auth/register
// @desc Register user with email and password
// @access Public
app.post('/auth/register', (req, res) => {
const { errors, isValid } = validateRegisterInput(req.body)
//Check Validation
if (!isValid) {
return res.status(400).json(errors)
}
// Check if User exists
User.findOne({ email: req.body.email }).then(user => {
if (user) {
errors.email = 'Email alresdy in use'
return res.status(400).json(errors)
} else {
const avatar = gravatar.url(req.body.email, {
s: '200', // Size
r: 'pg', // Rating
d: 'mm' // Default
})
const newUser = new User({
email: req.body.email,
name: req.body.name,
avatar,
password: req.body.password
})
newUser
.save()
.then(user => res.json(user))
.catch(err => console.info(err))
}
})
})
// @route POST /auth/login
// @desc User Login with Eamil and Password
// @access public
app.post(
'/auth/login',
passport.authenticate('local', {
successRedirect: '/api/success',
failureRedirect: '/api/failed'
})
)
}
сервер / услуги / паспортLocal.js
import passport from 'passport'
import mongoose from 'mongoose'
import { Strategy as LocalStrategy } from 'passport-local'
const User = mongoose.model('User')
passport.serializeUser((user, done) => {
// mongoID not googleID
console.info('reached serializeUser!')
done(null, user.id)
})
passport.deserializeUser((id, done) => {
// mongoID not googleID
User.findById(id).then(user => {
console.info('reached deserializeUser!')
done(null, user)
})
})
passport.use(
new LocalStrategy(
{
usernameField: 'email'
},
async (email, password, done) => {
const user = await User.findOne({ email: email })
console.info('reached LocalStrategy!')
if (!user || !user.validPassword(password)) {
return done(null, false)
} else {
return done(null, user)
}
}
)
)
Не удалось разобраться с этой проблемой, которая длится два дня ... Любой совет был бы потрясающим!
Привет, Радж, спасибо за быстрый ответ и извинения за поздний ответ! Пользователь возвращает сведения о существующих пользователях, сохраненные в базе данных. user.validPassword (пароль) возвращает true.
Извините, не могу придумать решение. Не могли бы вы просто попробовать новый проект с минимальным количеством кода и пакетов и проверить, сработало ли это? Таким образом вы сможете сузить проблему и приблизиться к ее решению.





Я нашел решение ...! Мне не хватало промежуточного программного обеспечения с кодировкой url, которое требовалось для чтения пар входных ключей и значений из Postman.
Добавлено: app.use (bodyParser.urlencoded ({extended: false})) в мой корневой файл index.js, и теперь все работает :)
проверьте значение user и user.validPassword (пароль)