Проверка PassportJS с помощью обратного вызова или модели Mongoose?

#node.js #validation #mongoose #passport.js

#node.js #проверка #mongoose #passport.js

Вопрос:

Я настраиваю passport для аутентификации пользователя при регистрации и входе в систему. Теперь я увидел, что могу проверить информацию с помощью обратного вызова, однако я также мог бы проверить информацию в пользовательской модели. Например, если я хочу сделать поле электронной почты обязательным, я могу сделать следующее:

Проверка с помощью Passport

 // Create the local sign up with Passport
passport.use('local-signup', new LocalStrategy({
        usernameField : 'userEmail', // Email Field
    passwordField : 'userPassword', // Password Field
    passReqToCallback : true
    },
    function(req, email, password, done) {

        // Find a user with this email
        User.findOne({ "local.email": email }, function(err, user) {

            if (err) throw err;

            // If a user with this email already exists, continue with failureRedirect
            if (user) {
                return done(null);

            } else {
                // Otherwise create a new user with the email and generate a hashed password
                User.create({
                    local: {
                        email: email
                    }
                }, function(err, user) {
                    if (err) throw err;

                    user.local.password = user.generateHash(password);

                    // Return the user and finish! :)
                    return done(null, user);
                });
            }
        });
    };
}));
  

С помощью пользовательской модели

 var userSchema = new Schema({
    local: {
        email: {
            type: String,
            unique: true // Make it unique! Handles entire validation
        },
        password: {
            type: String
        },
    }
});
  

Какой из них рекомендуется и почему?

Ответ №1:

Почему не оба? Если вы используете только второй, будет сложно отобразить сообщение

адрес электронной почты уже существует

поскольку вам нужно перехватить duplicate key error index , а затем отобразить сообщение об ошибке при регистрации. Вместо этого вы могли бы проверить, существует ли адрес электронной почты, который является более явным, и одновременно отобразить соответствующее сообщение об ошибке при регистрации, используя уникальный индекс, чтобы убедиться, что для адреса электронной почты нет повторяющихся записей.

Комментарии:

1. Хороший момент. Знаете ли вы какие-либо рекомендации, когда дело доходит до проверок в express или аутентификации?

2. Я сам относительно новичок в ПОНИМАНИИ стека. Но до сих пор я использовал промежуточное программное обеспечение, предоставляемое defualt, например auth.requiresLogin. Для проверки одного запроса вы можете использовать req.IsAuthenticated(). Но я еще не создал свои пользовательские авторизации. Возможно, вы можете создавать уровни доступа и использовать их в качестве промежуточных программ для авторизации уровней данных. Я не уверен, что это стандартная практика. Может быть, кто-то с большим опытом даст нам больше информации

3. У меня есть немного опыта Rails, поэтому я привык к активным проверкам записей . Я не использую MEAN stack, но я написал функцию isLoggedIn для маршрутов, которая проверяет, аутентифицирован ли пользователь или нет. Меня больше беспокоят проверки, такие как минимальные символы, максимальные символы, регулярное выражение, уникальность, присутствие и т.д. . Запись их в файл обратного вызова passport, на мой взгляд, довольно запутанна, особенно, если пользователь хочет внести изменения в свою информацию. Проверки должны быть переписаны в контроллер, который не является сухим

4. Я предполагаю, что вы используете mongoose. Вы можете определить пользовательскую проверку для типов схем, которые сами выступают в качестве промежуточного программного обеспечения. Но имейте в виду тот факт, что промежуточное программное обеспечение (проверка) не вызывается при использовании .update() .

5. Если вы считаете, что мой ответ решил вашу проблему, пожалуйста, не стесняйтесь пометить его как принятый ответ.