簡體   English   中英

django和angular.js與身份驗證

[英]django and angular.js with authentication

我有一個已經用Django編寫的Web應用程序,它運行得很好。 我想為角度添加一些視圖,因為計划是朝着那個方向移動。 我面臨的一個問題是我的一些控制器需要登錄,使用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

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

基本上,我想通過Angular確認我的用戶已登錄,如果沒有,則將其重定向到登錄頁面。

編輯

我正在實現一個請求攔截器,如下所示:

攔截器不起作用

但是,在django @login_required它返回重定向頁面的html。 有沒有辦法獲取URL並轉發用戶?

在$ 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

正如前面的答案中所提到的,如果您的Django后端在需要登錄時可以發出401響應,那將是最好的。 現在它聽起來像是在發送302,如果您正在發出XHR請求,您仍然可以在瀏覽器中觀察到它。 正如您所發現的,在Angular中使用$ http攔截器是查找401並將用戶發送到登錄頁面的常用方法。

我采取了不同的方法:通過一個名為$user.get()的方法實現一個抽象這一點的服務 - 它向已知端點(在我的例子中, /api/users/current )發出請求並拒絕如果它看到401,則返回promise。在你的情況下,你可以實現一個拒絕處理程序,它使用window.location.href將用戶發送到你的專用登錄頁面

免責聲明:我在Stormpath工作,我們花了一段時間思考這個問題:)在上面的評論中,我指的是我們的Stormpath Angular SDK - 你可以看看這個庫,看看我是如何解決這個問題的。

在定義我的應用程序時,我這樣做:

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

並且代碼如下:

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 我們必須創建一個新的裝飾器並使用url提供302狀態。

如果您通過AJAX將API調用回服務器,則很可能您不希望將響應重定向到登錄頁面。

我有相同的用例,當用戶沒有登錄時,我自己的裝飾器返回403.如果你願意,你也可以使用401(我把它留下了注釋)。

我使用403因為401似乎意味着WWW身份驗證

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重定向響應,因為很明顯它是客戶端錯誤(缺少身份驗證)。

你可以使用Http-Auth-Interceptor。 假設一個視圖需要登錄,並且用戶在沒有登錄的情況下向視圖發出請求,那么@login_required裝飾器將返回響應代碼為401的響應。在auth攔截器中,如果狀態代碼為401則截取狀態代碼,然后將用戶重定向到登錄頁面。

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

暫無
暫無

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

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