Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架中的用户身份验证&x2B;Angular.js web应用程序_Python_Django_Angularjs_Authentication_Django Rest Framework - Fatal编程技术网

Python Django Rest框架中的用户身份验证&x2B;Angular.js web应用程序

Python Django Rest框架中的用户身份验证&x2B;Angular.js web应用程序,python,django,angularjs,authentication,django-rest-framework,Python,Django,Angularjs,Authentication,Django Rest Framework,我正在开发一个网络应用程序,用户可以登录查看他们的在线酒窖 我已经安装了Django REST模型,以及Angular中的前端设计,但是我很难将这些部分组合起来,我的主要问题是用户身份验证 我已经阅读了很多关于此处的帖子和各种教程,但我似乎找不到一种逐步实现身份验证的方法: 应该使用哪种身份验证(令牌、会话、其他?) 如何在服务器端管理身份验证(它是视图还是UserModel或UserManager中的方法?) 我有一个自定义用户模型(使用电子邮件作为用户名)。我可以使用通用的Django登录

我正在开发一个网络应用程序,用户可以登录查看他们的在线酒窖

我已经安装了Django REST模型,以及Angular中的前端设计,但是我很难将这些部分组合起来,我的主要问题是用户身份验证

我已经阅读了很多关于此处的帖子和各种教程,但我似乎找不到一种逐步实现身份验证的方法:

  • 应该使用哪种身份验证(令牌、会话、其他?)
  • 如何在服务器端管理身份验证(它是视图还是UserModel或UserManager中的方法?)
  • 我有一个自定义用户模型(使用电子邮件作为用户名)。我可以使用通用的Django登录方法,还是需要创建自己的登录方法
  • 如何管理服务器端和客户端之间的身份验证过程
据我所知,Angular在url上发出POST请求,其中DRF验证用户名和密码是否匹配,并返回令牌或其他身份验证

我觉得我已经很接近了,但我需要一个更全面的视角来看待如何将这些片段组合在一起


提前感谢

我想有很多方法可以做到这一点,让我解释一下我的工作,希望能有所帮助。这将是一篇很长的文章。我很想听听其他人是如何做到这一点的,或者是如何更好地实施同样的方法。您还可以在Github上查看我的种子项目

我使用Witold Szczerba的令牌身份验证。他的方法的美妙之处在于,无论何时从您的站点发送的请求没有正确的凭据,您都会被重定向到登录屏幕,但您的请求会排队等待登录完成后重新启动

下面是一个用于登录表单的登录指令。它发布到Django的auth令牌端点,使用响应令牌设置cookie,使用令牌设置默认头,以便对所有请求进行身份验证,并触发http auth侦听器登录事件

.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();
          });
    });
  }
}
})

当用户访问站点时,我使用module.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>

... 登录表单
... ng视图,或html的大部分

还可以查看django rest验证和角度django注册验证

我们试图从后端和角度解决这两个库中最常见的Django auth/registration相关问题


谢谢

嗨,扎克,非常感谢你,太棒了!我将仔细查看您的代码,并告诉您它是如何运行的goes@bpipat我刚刚在seed项目中添加了持久化令牌,希望能有所帮助。是否可以使用Angular JS进行基于会话的身份验证,还是我们必须坚持基于令牌的身份验证?我没有在HTTPS上为我的应用程序提供服务,因此基于令牌的身份验证可能存在一些安全问题。如果基于会话的东西是可能的,你能帮我提供一些示例代码或上述代码中所需的更改吗?我理解这个问题非常广泛,但我不是在寻找实际的代码,而是在DRF中实现简单登录的方法。有了一些高质量的答案,比如@zack argyle,这可能对DRF新手有很大的帮助。这个问题被关闭了,因为太广泛了,这是SO社区恶性腐败的证据。这个问题问得相当简洁,扎克回答得很好,这是在谷歌上搜索确切问题时的第一个结果。这是一个RTFM无法解决的问题,所以它会被耗电的mods关闭。现在,由于它已经关闭,无法提供更多高质量的答案。如果你投票决定结束这场比赛,请立即前往蒂华纳,开始在综艺节目中表演的生活。