【问题标题】:How to integrate Koa, Passport and MongoDB?如何集成 Koa、Passport 和 MongoDB?
【发布时间】:2018-09-22 06:03:28
【问题描述】:

*请不要忽略这个问题的长度。它可能看起来很长,因为我附上了代码。实际的问题陈述真的很小。

我在过去两天尝试集成 Passport、 Koa 和 MongoDB。我一直失败,无法获得有关我所面临问题的任何参考。我主要关心的是让登录模块正常工作。

我的问题是在我的索引路由中处理与 koa-passport 关联的登录请求的函数正在被调用,并且 ctx.body 也作为响应发送,但 successRedirect 和 failureRedirect不工作。下面是我正在使用的文件。

auth.js 中,我在新的 LocalStrategy 内有控制台登录用户,就在 var 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

我无法从这里推断出任何东西。我进行了广泛的搜索,并将代码更改为可以工作到这里。

【问题讨论】:

  • 好吧yield User.find({username: name}) 肯定应该是yield User.findOne({username: name}),因为.find()返回一个Cursor,你显然期待一个“普通对象”。坦率地说,您可能会过度使用生成器,应该简单地返回承诺并解决它。乍一看,您有一些问题可以通过“将其分解成更小的部分”更好地解决,然后了解每一位的实际作用。例如,了解 Promises 和 Generators 可能是一个很好的起点。然后了解每个 API。
  • User.findOne({ username: username, password: password }, done) .then((user) =&gt; { console.log(user); if(!user) { return null } else { return user } return done(null, user) }) 这是你建议我过度使用发电机的原因吗?
  • 我认为这可能会有所帮助mherman.org/blog/2018/01/02/…
  • @RajThakar我已经实现了。它没有用。我一次又一次遇到同样的问题(与登录逻辑无关,successRedirect 和faiureRedirect 不起作用)。
  • 我建议你放弃生成器,转而采用 js promises。 Koa 是为他们设计的。

标签: node.js mongoose passport.js koa koa-passport


【解决方案1】:

也许它与这段代码有关,其中似乎没有声明user

passport.deserializeUser( async (id, done) => {
  done(null, user)
})

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2020-05-02
    • 2020-01-20
    • 1970-01-01
    • 2016-10-03
    • 2015-10-30
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多