Ответ 1
Я предполагаю, что есть много способов сделать это, позвольте мне объяснить, что я делаю, надеюсь, это полезно. Это будет длинный пост. Мне бы хотелось услышать, как это делают другие, или лучше использовать один и тот же подход. Вы также можете проверить мой проект на Github, Angular -Django-Seed.
Я использую аутентификацию с помощью токена с Witold Szczerba http-auth-interceptor. Красота его подхода заключается в том, что всякий раз, когда запрос отправляется с вашего сайта без надлежащих учетных данных, вы перенаправляетесь на экран входа в систему, но ваш запрос ставится в очередь для повторного запуска при завершении входа.
Вот директива входа, используемая с формой входа. Он отправляется в конечную точку маркера аутентификации Django, устанавливает cookie с маркером ответа, устанавливает заголовок по умолчанию с токеном, чтобы все запросы были аутентифицированы и запускает событие входа в http-auth-interceptor.
.directive('login', function ($http, $cookieStore, authService) {
return {
restrict: 'A',
link: function (scope, elem, attrs) {
elem.bind('submit', function () {
var user_data = {
"username": scope.username,
"password": scope.password,
};
$http.post(constants.serverAddress + "api-token-auth", user_data, {"Authorization": ""})
.success(function(response) {
$cookieStore.put('djangotoken', response.token);
$http.defaults.headers.common['Authorization'] = 'Token ' + response.token;
authService.loginConfirmed();
});
});
}
}
})
Я использую метод .run модуля для установки проверки на файл cookie, когда пользователь приходит на сайт, если у них есть набор файлов cookie, я установил авторизацию по умолчанию.
.run(function($rootScope) {
$rootScope.$broadcast('event:initial-auth');
})
Вот моя директива перехватчика, которая обрабатывает трансляции authService. Если требуется логин, я скрываю все и показываю форму входа. В противном случае скройте форму входа и покажите все остальное.
.directive('authApplication', function ($cookieStore, $http) {
return {
restrict: 'A',
link: function (scope, elem, attrs) {
var login = elem.find('#login-holder');
var main = elem.find('#main');
scope.$on('event:auth-loginRequired', function () {
main.hide();
login.slideDown('fast');
});
scope.$on('event:auth-loginConfirmed', function () {
main.show();
login.slideUp('fast');
});
scope.$on('event:initial-auth', function () {
if ($cookieStore.get('djangotoken')) {
$http.defaults.headers.common['Authorization'] = 'Token ' + $cookieStore.get('djangotoken');
}
else {
login.slideDown('fast');
main.hide();
}
});
}
}
})
Чтобы использовать его, все мои html были в основном такими.
<body auth-application>
<div id="login-holder">
... login form
</div>
<div id="main">
... ng-view, or the bulk of your html
</div>