Я создаю небольшое демонстрационное приложение для изучения аутентификации пользователей с помощью passport.js, sequelize & express.Когда я нажимаю на мою конечную точку / register, она просто создает учетную запись пользователя.То же самое, если я попаду в конечную точку / logIn, он вернет нужного пользователя, если я предоставлю ему правильные учетные данные.
Проблема, с которой я столкнулся, заключается в том, что после запуска сервера и нажатия кнопки /зарегистрироваться или / logIns конечная точка, сервер перестанет отвечать на все запросы GET и POST, пока я не перезапущу сервер.
Вот мой код index.js:
var express = require('express')
var bodyParser = require('body-parser')
var Sequelize = require('sequelize')
var session = require('express-session')
var passport = require('passport')
var bCrypt = require('bcrypt')
var LocalStrategy = require('passport-local').Strategy
var flash = require('connect-flash')
var morgan = require('morgan')
var app = express()
app.use(express.static('public'))
app.use(bodyParser.json())
app.use(session({ secret: 'keyboard cat' }))
app.use(passport.initialize())
app.use(passport.session())
app.use(flash())
// Sequelize & Sequelize models
var sequelize = new Sequelize('auth_demo', 'auth_demo', 'auth_demo', {
host: 'localhost',
dialect: 'mysql'
})
var User = sequelize.define('user', {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true
},
username: {
type: Sequelize.STRING
},
password: {
type: Sequelize.STRING
}
})
// Server initialization stuff
require('./config/passport.js')(passport, User)
sequelize
.sync()
.then(() => {
console.log('Connection successfully established')
})
.catch(err => {
console.log('Unabled to connect:', err)
})
app.listen(3000, () => {
console.log('App is running on port 3000')
})
// Routes.
app.post('/register', passport.authenticate('local-signup'),
function(req, res) {
res.send(req.user)
})
app.post('/logIn', function(req, res, next) {
passport.authenticate('local-signin', function(err, user, info) {
if (err) {
console.log("found err")
return next(err)
}
if (!user) {
console.log("didnt find user")
return res.redirect('/')
}
req.logIn(user, function(err) {
console.log("executing login")
if (err) { return next(err) }
console.log(req)
return res.send(user)
})
})(req, res, next)
})
app.get('/loggedInUser', function(req, res) {
console.log(req.user)
res.send(req.user)
})
app.get('/test', (req, res) => {
console.log(req)
res.send('Hello')
})
Также вотФайл passport.js для отображения стратегий:
const LocalStrategy = require('passport-local').Strategy
const bCrypt = require('bcrypt')
module.exports = function(passport, User) {
// Passport stuff
passport.serializeUser(function(user, done) {
done(null, user.id)
})
passport.deserializeUser(function(user, done) {
User.findById(user.id, function(err,user) {
done(err, user)
})
})
// Configure passport strategy
passport.use('local-signup', new LocalStrategy({
usernameField: 'username',
passwordField: 'password'
},
function (username, password, done) {
var generateHash = function(password) {
return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null)
}
User.findOne({ where: { username: username } }).then(function(user) {
if (user) {
return done(null, false, { message: 'That user already exists' })
} else {
console.log("Creating user")
var userPassword = generateHash(password)
User.create({
username: username,
password: userPassword
})
.then(function(newUser) {
if (!newUser) {
return done(null, false)
}
if (newUser) {
return done(null, newUser)
}
})
}
})
}
))
passport.use('local-signin', new LocalStrategy({
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true
},
function (req, username, password, done) {
var isValidPassword = function(userpass, password) {
return bCrypt.compareSync(password, userpass)
}
User.findOne({
where: {
username: username
}
}).then(function(user) {
if (!user) {
console.log("didnt find user")
return done(null, false, {
message: 'User does not exist'
})
}
if (!isValidPassword(user.password, password)) {
console.log("bad password")
return done(null, false, {
message: 'Incorrect password'
})
}
return done(null, user)
})
.catch(function(err) {
console.log("Error:", err)
return done(null, false, {
message: 'Something went wrong with your signin'
})
})
}
))
}
Если я попадаю в конечную точку / test до того, как пытаюсь попасть в конечную точку / logIn или / register, он работает нормально и выдает «hello», как и ожидалось.Однако, если я нажму конечную точку / logIn или / register сразу после запуска сервера, а затем попытаюсь нажать / протестировать запрос, он зависнет и никуда не денется.
Вот что печатает экспресс-отладчиктерминал, когда он зависает:
express:router dispatching GET /test +4s
express:router query : /test +1ms
express:router expressInit : /test +0ms
express:router serveStatic : /test +0ms
express:router jsonParser : /test +2ms
express:router session : /test +0ms
express:router initialize : /test +0ms
express:router authenticate : /test +0ms
Он останавливается на экспрессе: маршрутизатор аутентифицируется, поэтому я склонен полагать, что это паспорт.
Любая помощь приветствуется, спасибо.