Паспорт / Passport-local-mongoose: пытается аутентифицировать 2 разные коллекции - PullRequest
0 голосов
/ 11 марта 2019

Пожалуйста, помогите мне понять, что здесь происходит ...

У меня есть модель Mongoose, подключенная к passport-local-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)

Затем у меня есть экспрессМаршрутизатор определен как:

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()
})

Мои сомнения:

В моих тестах япросто вызываю конечную точку, и она работает.Я НЕ настраиваю passport.use ('local', User.createStrategy ()) (ни blablabla).Я НЕ вызываю app.use (passport.initialize ()).

Видите строку, где я использую passport.authenticate('blablabla',?Кажется, не имеет значения, какую нить я положил туда ... И она проходит.Но я думаю, что не должно, верно?

Я использую аутентификацию на основе токенов и, следовательно, я не использую сеанс или сериализацию / десериализацию.Но разве я не должен определять стратегию и инициализировать паспорт?!

Моя конечная цель - найти способ использования двух разных коллекций для аутентификации пользователей.Итак, следил за этим вопросом , и я думал, что смогу сделать что-то вроде:

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

И затем позвонить passport.authenticate('user1-local', ...

Но потом, когда я начал играть сНазвание стратегии, я был удивлен, что, кажется, это не имеет значения.Из-за этого я даже не пытался использовать две коллекции.

Может кто-нибудь помочь мне, пожалуйста, понять, что происходит и как я могу использовать passport / passport-local-mongoose с двумя разными коллекциями одновременно?

Обновление:

Итак, я только что изменил passport.authenticate call на это:

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

И теперь это не воссоздание «блаблабла», как я ожидал.И потом, это работает, когда я использую:

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

Я догадываюсь, что это решает проблему аутентификации с 2 коллекциями.

... Но все же, я не знаю, почему это былопереходя с предыдущего звонка.Буду признателен, если кто-нибудь сможет объяснить.

...