【问题标题】:How to configure and package passport as a one module?如何将护照配置和打包为一个模块?
【发布时间】:2016-02-08 16:34:49
【问题描述】:

我在 Advanced Rest Client 中测试我的路由,我的代码输出为 401,未经授权。我不明白为什么会这样。 我将身份验证打包在一个模块中。然后,我使用 wagner-core(dependency injector) 在我的服务器文件中调用它:

wagner.invoke(require('./passport-init'),{ app: app })

passport.js:

'use strict'
const bCrypt = require('bcryptjs')
const passport = require('passport')
const LocalStrategy = require('passport-local').Strategy
const session = require('express-session')

module.exports = (User, app) => {
  passport.serializeUser((user, done) => {
    done(null, user._id)
  })

  passport.deserializeUser((id, done) => {
    User.findOne({ _id: id }).exec(done)
  })

  passport.use('login', new LocalStrategy({ passReqToCallback: true }, (req, username, password, done) => {
    User.findOne({ username: username }, (err, user) => {
      if (err) { return done(err) }
      if (!user) { return done(null, false, { message: 'Invalid username' }) }
      if (!isValidPassword(user, password)) {
        return done(null, false, { message: 'Invalid password' })
      }
      return done(null, user)
    })
  }))

  app.use(session({
    secret: process.env.SESSION_SECRET || 'secret',
    resave: false,
    saveUninitialized: false
  }))
  app.use(passport.initialize())
  app.use(passport.session())

  app.post('/login', passport.authenticate('login'), (req, res) => {
    res.redirect('/users/' + req.user.username)
  })
}

function isValidPassword (user, password) {
  return bCrypt.compareSync(password, user.password)
}

【问题讨论】:

    标签: node.js authentication passport.js passport-local


    【解决方案1】:

    我想通了。这与我的路线和 isValidpassword 功能有关。

    这是修改后的代码:

    'use strict'
    const bCrypt = require('bcryptjs')
    const passport = require('passport')
    const LocalStrategy = require('passport-local').Strategy
    const session = require('express-session')
    
    module.exports = (User, app) => {
      passport.serializeUser((user, done) => {
        done(null, user._id)
      })
    
      passport.deserializeUser((id, done) => {
        User.findById(id, (err, user) => {
          done(err, user)
        })
      })
    
      passport.use('login', new LocalStrategy({ passReqToCallback: true }, (req, username, password, done) => {
        process.nextTick(() => {
          User.findOne({ username: username }, (err, user) => {
            if (err) { return done(err) }
            if (!user) { return done(null, false, { message: 'Invalid username' }) }
            if (!user.password) {
              bCrypt.compareSync(password, user.password)
              return done(null, false, { message: 'Invalid password' })
            }
            return done(null, user)
          })
        })
      }))
    
      passport.use('signup', new LocalStrategy({ passReqToCallback: true }, (req, username, password, done) => {
        process.nextTick(() => {
          User.findOne({ username: username }, (err, user) => {
            if (err) { return done(err) }
            if (user) {
              return done(null, false, { message: 'User already exists' })
            } else {
              let newUser = new User()
              newUser.username = req.body.username
              newUser.password = createHash(req.body.password)
              newUser.save((err) => {
                if (err) throw err
                return done(null, newUser)
              })
            }
          })
        })
      }))
    
      app.use(session({
        secret: 'secret',
        resave: false,
        saveUninitialized: false
      }))
      app.use(passport.initialize())
      app.use(passport.session())
    
      app.get('/success', (req, res) => {
        res.send({ state: 'success', user: req.user ? req.user : null })
      })
    
      app.post('/login', passport.authenticate('login', {
        successRedirect: '/success',
        failureRedirect: '/fail'
      }))
    
      app.post('/signup', passport.authenticate('signup', {
        successRedirect: '/success',
        failureRedirect: '/fail'
      }))
    }
    
    function createHash (password) {
      return bCrypt.hashSync(password, bCrypt.genSaltSync(10), null)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-22
      • 2015-12-25
      • 2019-02-25
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多