Подтвердить что ты не робот

Аутентификация пользователя в Django Rest Framework + Angular.js веб-приложение

Я работаю над webapp, где пользователи могут входить в винный погреб онлайн.

У меня есть настройка моделей Django REST, а также интерфейсный дизайн в Angular, но у меня возникли проблемы с компоновкой деталей, и моя основная проблема заключается в аутентификации пользователя.

Я прочитал много сообщений здесь и различных учебных пособий, но я не могу найти пошаговый метод для реализации проверки подлинности:

  • Какой тип auth должен использоваться (токен, сеанс, другое?)
  • Как выполняется проверка подлинности на стороне сервера (это метод просмотра? в UserModel или UserManager?)
  • У меня есть пользовательская модель пользователя (используя электронную почту как имя пользователя). Могу ли я использовать общий метод входа в Django или мне нужно создать свой собственный?
  • Как выполняется процесс аутентификации между сервером и клиентской стороной?

Из того, что я понимаю, Angular делает запрос POST на URL-адресе, где DRF проверяет совпадение имени пользователя и пароля и возвращает токен или другое подтверждение проверки подлинности.

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

Заранее спасибо

4b9b3361

Ответ 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>