Passport / Passport-local-mongoose:尝试验证2个不同的收藏集

时间:2019-03-11 07:31:14

标签: express passport.js passport-local mongoose-plugins

请帮助我了解这里发生的事情...

我将Mongoose模型插入了本地护照猫鼬

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const passportLocalMongoose = require('passport-local-mongoose');

var UsersSchema = new Schema({
    email: String, 
    password: String
})
UsersSchema.plugin(passportLocalMongoose, {
    usernameField: 'email'
})
module.exports = mongoose.model('Users', UsersSchema)

然后,我将Express路由器定义为:

usersRouter.use(bodyParser.json())
usersRouter.route('/register')
    .post(
        Validate.registerUserReq,  // nothing relevante here
        Controller.registerUser,
        Controller.respond         // nothing relevante here
    )

Controller.registerUser是:

const _registerUser = asyncMiddleware( async (req, res, next) => {
    const registerUser = (newUser) => {
        let password = req.password

        return new Promise((resolve, reject) => {
            Users.register(newUser, password, function(err, user) {
                if (err) reject(err)

                let userObj = {
                    "email": user.email, 
                    "_id": user._id
                }
                user.tempToken = Verify.getToken(userObj, REGISTRATION_TOKEN_TIME)

                user.save(function(err,user) { 
                    if (err) reject(err)
                    resolve(user)
                })
            })
        })
    }

    const sendConfirmationEmail = (email) => {
        return new Promise((resolve, reject) => {
            //passport.authenticate('local')(req, res, function () {
            passport.authenticate('blablabla', { session: false })(req, res, function () {
                 // send email...
            })

    let newUser = new Users ({
        email: req.email 
    })

    let user = await registerUser(newUser)
    let email = user.email
    res.result = await sendConfirmationEmail(email)

    next()
})

我的疑问:

在我的测试中,我只是在呼叫端点,并且端点正在运行。 我未设置password.use('local',User.createStrategy())(都不设置blablabla)。我不打电话给app.use(passport.initialize())。

看到我正在使用的行passport.authenticate('blablabla',吗? 看来我放在哪串都没关系...它正在过去。但是我认为不应该吧?

我使用的是基于令牌的身份验证,因此我没有在使用会话或序列化/反序列化。但是我不应该定义策略并初始化护照吗?!

我的最终目标是找到一种使用两个不同集合对用户进行身份验证的方法。所以跟随this question,我在想我可以做些类似的事情:

passport.use('user1-local', Users1.createStrategy())
passport.use('user2-local', Users2.createStrategy())

然后致电passport.authenticate('user1-local', ...

但是当我开始使用该策略的名称时,我感到很惊讶,这似乎无关紧要。因此,我什至没有尝试使用两个集合。

有人可以帮助我了解最新情况以及如何同时使用具有两个不同馆藏的护照/护照-本地猫鼬吗?

更新

所以,我只是更改了passport.authenticate对此的呼叫:

passport.authenticate('user-local', { session: false }, function (err, user, info) {    
     // ...
})(req, res, next)

现在,正如我所期望的那样,它不是在协调“ blablabla”。然后,它在我使用时有效:

passport.use('blablabla', Users.createStrategy())
app.use(passport.initialize())

我猜想这解决了使用2个集合进行身份验证的问题。

...但是,我仍然不知道为什么上次调用会失败。如果有人可以解释,我将不胜感激。

0 个答案:

没有答案