django和angular.js与身份验证

时间:2015-03-04 05:58:18

标签: django angularjs

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

但是当angular.js调用控制器(对于api)时,重定向没有发生。我假设我必须以某种方式检查我的django用户是否直接从角度侧进行身份验证。关于如何在角度上确认这个有什么解释吗?我一直在努力解决这个问题并阅读以下内容:

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

https://medium.com/@vince_prignano/angular-js-with-django-bde834dbd61e

$routeProvider not triggered after login redirect

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

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

修改

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

Interceptor not working

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

4 个答案:

答案 0 :(得分:1)

在$ routeProvider中添加解决方案:

    $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 :(得分:1)

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

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

免责声明:我在Stormpath工作,我们花了一段时间考虑这个:)在我上面的评论中,我指的是我们的Stormpath Angular SDK - 你可以看看这个库到看看我是如何解决这个问题的。

答案 2 :(得分:1)

如果您通过AJAX将API调用回服务器,则很可能您不希望将响应重定向到登录页面。

我有相同的用例,当用户没有登录时,我自己的装饰器返回403.如果你愿意,你也可以使用401(我把它留下了注释)。

我使用403因为401 seems to imply WWW authentication

from django.http import HttpResponse, HttpResponseForbidden


def logged_in_or_deny(func):
    def check_request(request, *args, **kwargs):
        if (request.user.is_authenticated()):
            return func(request, *args, **kwargs)
        else:
            return HttpResponseForbidden('You must be logged in')       # 403 Response
            #return HttpResponse('You must be logged in', status=401)    # 401 Response
    return check_request

然后你会像这样保护你的观点:

@logged_in_or_deny
def your_view(request):
    # ... your code ...
    return HttpResponse('Your normal response :)')

从Angular看来,您似乎已经知道如何使用拦截器来检查响应代码并相应地重定向用户。如果你使用403或401,你应该检查反应机构,以防你以后回复类似的错误。

虽然您已经拥有的功能可以使用,但是出于其他原因可以使用302响应。拥有明确的4xx响应而不是3xx重定向响应会更好,因为它很明显是客户端错误(缺少身份验证)。

答案 3 :(得分:0)

您可以使用Http-Auth-Interceptor。假设一个视图需要登录,并且用户在没有登录的情况下向视图发出请求,那么@login_required装饰器将返回响应代码为401的响应。在auth拦截器中,如果状态代码为401则截取状态代码,然后将用户重定向到登录页面。

示例网站:http://witoldsz.github.io/angular-http-auth/