首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用身份验证的django和angular.js

使用身份验证的django和angular.js
EN

Stack Overflow用户
提问于 2015-03-04 05:58:17
回答 5查看 1.7K关注 0票数 6

我有一个已经用Django编写的web应用程序,它运行得很好。我想增加一些角度的看法,因为计划是向那个方向移动。我面临的一个问题是,我的一些控制器需要登录,对于django,我们通常使用@login_required装饰器,一切都很好。

但是,由于angular.js调用控制器(对于api),重定向不会发生。我假设我必须以某种方式检查django用户是否直接从角度侧面进行身份验证。关于如何在角度上证实这一点,有什么解释吗?我一直在与此作斗争,并阅读了以下内容:

https://docs.angularjs.org/api/ng/service/$http

prignano/角-js-with-django-bde834dbd61e

登录重定向后未触发$routeProvider

http://www.django-rest-framework.org/api-guide/authentication/

基本上,我想确认,通过角,我的用户已登录,如果没有,重定向到登录页面。

编辑

我正在实现一个请求拦截器,如下所示:

拦截器不工作

但是,在django @login_required中,它返回重定向页面的html。有没有办法获取URL并将用户转发到那里?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-08-25 04:19:46

在定义我的应用程序时,我会这样做:

$httpProvider.interceptors.push('errorInterceptor');

这方面的代码如下:

代码语言:javascript
运行
复制
app.factory('errorInterceptor', ['$q', '$rootScope', '$location',
    function ($q, $rootScope, $location) {
        return {
            request: function (config) {
                return config || $q.when(config);
            },
            requestError: function(request){
                return $q.reject(request);
            },
            response: function (response) {
                return response || $q.when(response);
            },
            responseError: function (response) {
                if (response && response.status == 302 && response.data.url) {
                    window.location = response.data.url;
                    return;
                }
                return $q.reject(response);
            }
        };
}]);

基本上,我们不能使用login_required。我们必须创建一个新的装饰师,并提供302状态与一个url。

票数 1
EN

Stack Overflow用户

发布于 2015-03-04 06:15:55

在$routeProvider中添加“解析”如下:

代码语言:javascript
运行
复制
    $routeProvider 
      .when('/', { 
         templateUrl: '/views/main.html' }) 
      .when('/admin', {
         templateUrl: 'views/admin.html', 
         controller: 'AdminCtrl', 
         resolve: { loggedin: checkLoggedin } }) 
      .when('/login', { 
         templateUrl: 'views/login.html', 
         controller: 'LoginCtrl' }) 
      .otherwise({ redirectTo: '/' }); -

请参阅更多信息:https://vickev.com/#!/article/authentication-in-single-page-applications-node-js-passportjs-angularjs

票数 1
EN

Stack Overflow用户

发布于 2015-03-09 14:43:54

正如前面的答案所提到的,最好是在需要登录时,Django后端可以发出401响应。现在,它似乎正在发送302,如果您正在发出XHR请求,您仍然可以在浏览器中观察到这一点。正如您所发现的,在角中使用$http拦截器是查找401并将用户发送到登录页面的常见方法。

我采取了一种不同的方法:通过一个名为$user.get()的方法实现一个稍微抽象一点的服务--它向已知的端点发出请求(在我的例子中是/api/users/current),如果它看到401,就拒绝返回的承诺。在您的情况下,您可以实现一个拒绝处理程序,它使用window.location.href将用户发送到您的专用登录页面。

免责声明:我在风暴路径工作,我们花了很多时间思考这个问题:)在我上面的评论中,我指的是我们的风暴路径角SDK --您可以查看这个库,看看我是如何解决这个问题的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28847569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档