Как интегрировать Koa, Passport и MongoDB?
* Пожалуйста, не игнорируйте вопрос, глядя на его длину. Это может показаться длинным, потому что я прикрепил код. Фактическая постановка задачи действительно мала.
Я пытался интегрировать Passport, Koa и MongoDB за последние два дня. Я терпел неудачу и не могу получить никаких ссылок относительно проблемы, с которой я столкнулся. Моя главная задача - просто заставить работать модуль входа в систему.
Моя проблема в том, что вызывается функция для обработки пост-запроса на вход в мои индексные маршруты, связанные с koa-passport, и ctx.body также отправляется в качестве ответа, но successRedirect и failRedirect не работают. Внизу находятся файлы, которые я использую.
В auth.js я зарегистрировал пользователя консоли в новой LocalStrategy, сразу после строки user user =. В консоль ничего не записано.
auth.js
const passport = require('koa-passport')
const LocalStretegy = require('passport-local').Strategy
const mongoose = require('mongoose')
const User = mongoose.model('User', mongoose.Schema({}, { strict: false }))
function *getUser(name) {
let user = yield User.find({username: name})
return user
}
passport.serializeUser( (user, done) => {
done(null, user.id)
})
passport.deserializeUser( async (id, done) => {
done(null, user)
})
passport.use(new LocalStretegy( (username, password, done) => {
co(function*() {
try {
var user = yield getUser(username)
if (user.username === username && user.password === password) {
return user
} else {
return null
}
} catch(e) {
return null
}
}).then((user) => {
done(null, user)
})
}))
module.exports = passport
/routes/index.js
const router = require('koa-router')()
const sendfile = require('koa-sendfile')
const passport = require('koa-passport')
const mongoose = require('mongoose')
const Counter = mongoose.model('Counter', mongoose.Schema({}, { strict: false }))
router.post('/custom', (ctx, next) => {
return passport.authenticate('local', function(user, info, status) {
if (user === false) {
ctx.status = 401
ctx.body = { success: false }
ctx.body = { success: true }
} else {
return ctx.login(user)
}
})(ctx, next)
})
router.post('/login', (ctx) => {
passport.authenticate('local', {
successRedirect: '/dash-board',
failureRedirect: '/login'
})
ctx.body={status: 'okay'}
})
router.get('/logout', (ctx) => {
ctx.logout()
ctx.redirect('/')
})
module.exports = router
app.js
const Koa = require('koa')
const router = require('koa-router')()
const app = new Koa()
app.proxy = true
//Routes
const users = require('./routes/users')
const index = require('./routes/index')
//Error handler
const onerror = require('koa-onerror')
onerror(app)
//MongoDB connection
const mongoose = require('mongoose')
mongoose.Promise = global.Promise
try{
mongoose.connect('mongodb://<user>:<pass>@<something>.mlab.com:<number>/<someDB>?poolSize=10&retries=5')
} catch(err) {
console.log(err)
}
// Sessions
const convert = require('koa-convert')
const session = require('koa-generic-session')
const MongoStore = require('koa-generic-session-mongo')
app.keys = ['key1']
app.use(convert(session({
store: new MongoStore()
})))
//body parser
const bodyparser = require('koa-bodyparser')
app.use(bodyparser({
enableTypes:['json', 'form', 'text']
}))
//passport
require('./auth')
const passport = require('koa-passport')
app.use(passport.initialize())
app.use(passport.session())
app.use(index.routes(), index.allowedMethods(), users.prefix('/index'))
app.use((ctx, next) => {
if(ctx.isAuthenticated()) {
return next()
} else {
ctx.redirect('/')
}
})
app.use((ctx, next) => {
return next().catch(function (err) {
ctx.status = err.status || 500;
if (err.expose) {
ctx.body = err.message;
}
})
})
module.exports = app
Я не могу ничего сделать с этого момента. Я много искал и изменил код, чтобы работать, пока здесь.
1 ответ
Может быть, это как-то связано с этим кодом, в котором user
не кажется объявленным.
passport.deserializeUser( async (id, done) => {
done(null, user)
})