簡體   English   中英

當我通過ajax調用它時,Django Rest框架用AnonymousUser替換我當前經過身份驗證的用戶?

[英]Django Rest framework replacing my currently authenticated user with AnonymousUser whenever I call it via ajax?

我正在嘗試通過簡單的RESTful api和Javascript向Django管理頁面添加一些交互式內容。 應該很簡單,但我面臨一個奇怪的問題,我的每一個請求都來自javascript返回403授權錯誤。 請注意,這僅適用於js。 我可以從瀏覽器中輕輕點擊並完成所有基本的CRUD工作。

代碼非常基礎。

使用Javascript

$.ajax({
    xhrFields: {withCredentials: true},
    type: 'PATCH',
    url: 'path/to/my/endpoint,
    data: {
        aParam: someValue,
        'csrfmiddlewaretoken': getCookie('csrftoken')
    },
    success: doSomething,
    error: doSomething
});

蟒蛇

class MyObjectDetail(RetrieveUpdateDestroyAPIView):
  queryset = MyObject.objects.all()
  serializer_class = MyObjectSerializer

  authentication_classes = (SessionAuthentication,)
  permission_classes = (IsAuthenticated,)

我最初懷疑會話ID沒有被發送,因此這就是為什么一切都因為權限而失敗的原因。 但是,會話cookie確實是在ajax POST中發送的,並由Django中間件獲取。 Django沒有任何問題拉我的管理會話。 但是,(在經過大量調試之后)我已經將用戶重寫跟蹤到Django Rest Framework中的dispatch方法 - 特別是對self.initialize_request的調用。 在該調用返回后,我的管理員用戶被替換為其余的框架的AnonymouseUser

我完全迷失了。 我用調試器花了大約2個小時,但仍然不明白我的用戶被換出的原因。 以前有人遇到過這個嗎? 我只是做錯了嗎?

403錯誤的正文應該包含一條友好的消息,解釋問題是什么,我想在這種情況下你會發現消息抱怨缺少CSRF令牌。

請注意,這僅適用於js。 我可以從瀏覽器中輕輕點擊並完成所有基本的CRUD工作。

JS和瀏覽器之間只有一些不同的東西,而且它們都不是由Django REST框架直接引起的。 您可能遇到的問題是如何在AJAX請求中處理CSRFCSRF令牌應該通過標頭傳遞 現在,這意味着將JavaScript更改為

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

function addCsrfToken (xhr, settings) {
    if (!csrfSafeMethod(settings.type)) {
        xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
}

$.ajax({
    xhrFields: {withCredentials: true},
    type: 'PATCH',
    url: 'path/to/my/endpoint',
    data: {
        aParam: someValue
    },
    success: doSomething,
    error: doSomething,
    beforeSend: addCsrfToken
});

請注意,盡管Django文檔建議全局設置此標頭,但它明確禁止在跨源請求中發送標記。 您在代碼中看起來(來自withCredentials )您正在訪問其他域上的API。

Django沒有任何問題拉我的管理會話。

這很可能是因為在瀏覽器中點擊頁面不會觸發CSRF檢查,並且可瀏覽的API會為您處理CSRF。

在該調用返回后,我的Admin用戶被替換為其余的Framework的AnonymouseUser

Django REST框架只在一個地方處理匿名用戶, 那時驗證失敗 因此,雖然您的請求可能通過Django進行身份驗證,但可能沒有通過Django REST框架進行身份驗證。

暫無
暫無

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

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