Аутентификация возвращает " 401 (Unauthorized)", когда она не должна
Я впервые настраиваю функцию аутентификации и получаю неожиданные результаты после входа пользователя в систему. Коллега дал мне приложение с рабочей аутентификацией для моделирования моего приложения после, и кажется, что все, что я сделал, правильно.
Я использую AngularJS на переднем конце, SailsJS back-end framework и PassportJS промежуточное по аутентификации.
мой источник (на данный момент) сохраняется публично... бэкэнд API находится на Github здесь (API Github) и код переднего плана находится здесь (Передний Конец Github)
в основном происходит то, что пользователь
-
нажимает кнопку входа в систему, которая запускает эту функцию
login: function (credentials) { return baseAuth.customPOST(credentials, 'login').then(function (user) { $log.debug('User logged in: ', user); isAuthenticated = true; return user; }); },
-
логика контроллера для этого 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); },
-
на этом этапе паспорт должен сделать свое дело и войти в систему
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 на сервере сторона.
обычно "несанкционированная" ошибка 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.