Аутентификация возвращает " 401 (Unauthorized)", когда она не должна

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

Я использую AngularJS на переднем конце, SailsJS back-end framework и PassportJS промежуточное по аутентификации.

мой источник (на данный момент) сохраняется публично... бэкэнд API находится на Github здесь (API Github) и код переднего плана находится здесь (Передний Конец Github)

в основном происходит то, что пользователь

  1. нажимает кнопку входа в систему, которая запускает эту функцию

    login: function (credentials) {
        return baseAuth.customPOST(credentials, 'login').then(function (user) {
            $log.debug('User logged in: ', user);
            isAuthenticated = true;
            return user;
        });
    },
    
  2. логика контроллера для этого customPOST-это

    login: function (req, res, next) {
       passport.authenticate('local', function (err, user, info) {
           if (err) { return res.json(err); }
           else if (user) {
               req.logIn(user, function (err) {
                   if (err) { return res.json(err); }
                   return res.json(user);
               });
           } else { return res.json(400, info); }
    
       })(req, res);
    
    },
    
  3. на этом этапе паспорт должен сделать свое дело и войти в систему

    passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' },
    function(email, password, next) {
       User.findOne({ email: email })
           .exec(function (err, user) {
               if (err) { return next(err); }
               if (user) {
                    if (user.activated) {
                    bcrypt.compare(password, user.password, function (err, valid) {
                        if (err) { next(err); }
                        if (valid) {
                            return next(null, user, { message: 'Logged In' });
                        } else { return next(null, false, { message: 'Incorrect password'}); }
                    });
                } else { next(null, false, { message: 'User is not activated. Please contact admins.'}); }
            } else { next(null, false, { message: 'Could not find user with email ' + email }); }
        });
       }
     ));
    

в консоли я всегда получаю, что это успешно.

3 ответов


Если ваше приложение frontend имеет другое происхождение, чем ваше бэкэнд-приложение запросы AJAX не будут включать файл cookie сеанса и req.isAuthenticated() никогда не вернет true.

используйте параметры withCredentials, чтобы заставить его.

$http({ withCredentials: true, ... })

Кажется, что Restangular использует то же самое опции:

https://github.com/mgonto/restangular#setdefaulthttpfields

https://docs.angularjs.org/api/ng/service / $http#использование

Edit: вы также должны проверить на стороне сервера как указал idbehold


как предложил Matan, вы действительно должны попробовать генератор sails-generate-auth на сервере сторона.

https://github.com/sails101/even-more-passport

https://github.com/kasperisager/sails-generate-auth


обычно "несанкционированная" ошибка 401 фактически относится к ошибке учетных данных, а не к ошибке 403, которая относится к реальной несанкционированной ошибке(запрещено), поэтому вы должны сначала проверить своего клиента с почтальоном, чтобы проверить его, а затем перейти к клиенту.

хотя, я бы настоятельно рекомендовал вам выпадет из этого проекта github и использовать этот учебник, чтобы implmenet ваш паспорт.аутентификация js, поскольку вам нужно только выполнить 2 строки кода и некоторые конфигурации затем получите беспорядок с кодом: https://www.bearfruit.org/2014/07/21/tutorial-easy-authentication-for-sails-js-apps/


С passport.js работает, используя базовую концепцию стратегий, вам нужно убедиться, что вы аутентифицируетесь, используя правильный. Я не вижу нигде стратегии под названием "пользователь"

passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' },
function(email, password, next) {
   User.findOne({ email: email })
       .exec(function (err, user) {
           if (err) { return next(err); }
           if (user) {
                if (user.activated) {
                bcrypt.compare(password, user.password, function (err, valid) {
                    if (err) { next(err); }
                    if (valid) {
                        return next(null, user, { message: 'Logged In' });
                    } else { return next(null, false, { message: 'Incorrect password'}); }
                });
            } else { next(null, false, { message: 'User is not activated. Please contact admins.'}); }
        } else { next(null, false, { message: 'Could not find user with email ' + email }); }
    });
   }
 ));

следует заменить на

passport.use('user', new LocalStrategy({ usernameField: 'email', passwordField: 'password' },
function(email, password, next) {
   User.findOne({ email: email })
       .exec(function (err, user) {
           if (err) { return next(err); }
           if (user) {
                if (user.activated) {
                bcrypt.compare(password, user.password, function (err, valid) {
                    if (err) { next(err); }
                    if (valid) {
                        return next(null, user, { message: 'Logged In' });
                    } else { return next(null, false, { message: 'Incorrect password'}); }
                });
            } else { next(null, false, { message: 'User is not activated. Please contact admins.'}); }
        } else { next(null, false, { message: 'Could not find user with email ' + email }); }
    });
   }
 ));

также убедитесь, что ваш пользователь isUser флаг имеет значение true.