rest_framework 遇到`403`forbidden

rest_framework默認是對所有的視圖函數進行了csrf_exempt認證豁免。

如果你使用了postman等工具測試會發(fā)現確實是這樣,但是在實際的使用過程中,我們在發(fā)送post,update,patch,delete請求時依然會收到403 Forbidden 權限限制。

一、為什么會遇到這種情況

查看APIViewas_view()源碼,最后一行代碼:

# Note: session based authentication is explicitly CSRF validated,
# all other authentication is CSRF exempt.
return csrf_exempt(view)

翻譯過來就是:

基于`session`的用戶認證明確的要求了`CSRF`認證,其它的用戶認證類都進行豁免了。

如果你對rest_framework的用戶認證不熟悉的話,可以看看http://www.itdecent.cn/p/2079065de888

rest_framework.settings文件中,包含了rest_framework所有的默認設置,其中關于用戶認證類的設置:

'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication'
],

問題就出在SessionAuthentication中:
SessionAuthentication只對經過身份驗證的用戶執(zhí)行CSRF檢查,只有這樣才能避免CSRF攻擊,http://www.itdecent.cn/p/3b3264061b26講述了什么是csrf攻擊。

而對匿名用戶,則不進行csrf驗證,這就是為什么使用postman等工具能夠在不攜帶csrf-token的情況下進行訪問,而在正式環(huán)境中確會收到403 Forbidden

class SessionAuthentication(BaseAuthentication):

    def authenticate(self, request):
        """
        Returns a `User` if the request session currently has a logged in user.
        Otherwise returns `None`.
        """

        # Get the session-based user from the underlying HttpRequest object
        user = getattr(request._request, 'user', None)

        # Unauthenticated, CSRF validation not required
        if not user or not user.is_active:
            return None
        
        # 非匿名用戶,則需要進行 CSRF 驗證
        self.enforce_csrf(request)

        # CSRF passed with authenticated user
        return (user, None)

二、如何解決

1.推薦的做法,獲取并攜帶csrf-token
2.使用自己的Authentication認證類,覆蓋SessionAuthentication認證。
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容