Django Rest框架中的用户authentication+ Angular.js Web应用程序
我正在开发一个web应用程序,用户可以login查看他们的在线酒窖。
我有Django REST模型设置,以及Angular中的前端devise,但是我很难将这些部分放在一起,而我的主要问题是用户身份validation。
我已经阅读了很多post在这里和各种教程,但我似乎无法find一步一步的方法来实现身份validation:
- 什么样的authentication应该使用(令牌,会话,其他?)
- 在服务器端如何pipe理身份validation(在UserModel或UserManager中是一个视图吗?)
- 我有一个自定义用户模型(使用电子邮件作为用户名)。 我可以使用通用的Djangologin方法,还是需要创build自己的?
- 如何在服务器和客户端之间pipe理身份validation过程?
据我所知,Angular在DRFvalidation用户名和密码匹配的URL上发出POST请求,并返回一个令牌或其他validation证据。
我觉得我很接近,但我需要一个更普遍的看法,这是如何工作把碎片放在一起。
提前致谢
我想有很多方法可以做到这一点,让我解释我做了什么,希望它是有帮助的。 这将是一个很长的职位。 我很想听听其他人如何做到这一点,或者更好地实施相同的方法。 你也可以在Github上看看我的种子项目, Angular-Django-Seed 。
我使用Witold Szczerba的http-auth拦截器进行令牌authentication。 他的方法的美妙之处在于,只要您的网站发送的请求没有正确的凭据,就会被redirect到login屏幕,但是您的请求会在login完成后重新排列。
以下是login表单使用的login指令。 它发布到Django的身份validation令牌端点,使用响应令牌设置cookie,使用令牌设置默认头,以便所有请求都将被validation,并触发http-auth-interceptorlogin事件。
.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广播。 如果需要login,我隐藏所有内容并显示login表单。 否则,隐藏login表单,并显示一切。
.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
我们试图从这两个库的后端和angular度angular度来解决最常见的Djangoauthentication/注册相关的事情。
谢谢!