簡體   English   中英

Django Rest Framework + Angular.js Web應用程序中的用戶身份驗證

[英]User Authentication in Django Rest Framework + Angular.js web app

我正在開發一個webapp,用戶可以登錄以查看他們的在線酒窖。

我有Django REST模型設置,以及Angular中的前端設計,但我將這些部分放在一起很麻煩,我的主要問題是用戶身份驗證。

我在這里閱讀了很多帖子和各種教程,但我似乎無法找到一步步實現身份驗證的方法:

  • 應該使用什么樣的身份驗證(令牌,會話,其他?)
  • 如何在服務器端管理身份驗證(它是一個視圖?UserModel或UserManager中的方法?)
  • 我有一個自定義用戶模型(使用電子郵件作為用戶名)。 我可以使用通用的Django登錄方法,還是需要創建自己的?
  • 如何在服務器端和客戶端之間管理身份驗證過程?

根據我的理解,Angular在URL上發出POST請求,其中DRF驗證用戶名和密碼是否匹配並返回令牌或其他身份證明。

我覺得我很接近,但我需要更全面地了解這是如何將各個部分組合在一起的。

提前致謝

我想有很多方法可以做到這一點,讓我解釋一下我的做法,希望它有所幫助。 這將是一個很長的帖子。 我很想知道其他人如何做到這一點,或者更好的方法來實現相同的方法。 您還可以在Angular-Django-Seed的 Github上查看我的種子項目。

我使用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>

查看django-rest-auth和angular-django-registration-auth

https://github.com/Tivix/angular-django-registration-auth

https://github.com/Tivix/django-rest-auth

我們試圖從這兩個庫中的后端和角度角度解決最常見的Django auth / registration相關事物。

謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM