DRF 异常 'NotAuthenticated' 引发 500 Internal Server Error 代替 401/403

DRF exception 'NotAuthenticated' raising 500 Internal Server Error in place of 401/403

我有一个 Django 中间件,我在其中验证了一个 firebase IDToken。

from rest_framework import exceptions

def process_request(request):
    ...
    try:
        decoded_token = auth.verify_id_token(id_token)
        uid = decoded_token['uid']
    except:
        raise exceptions.NotAuthenticated(detail='not authenticated')

当验证失败时,auth抛出一个异常,该异常被try except块捕获。但是 NotAuthenticated 没有引发 401/403 错误,而是引发了 500 内部服务器错误。

发生这种情况是因为 DRF 异常的某些工作吗?

DRF handles sending status code 401 or 403 取决于从您的 视图.

中引发的异常(NotAuthenticatedPermissionDenied

但是由于您使用的是中间件,因此 DRF 已经不在考虑范围之内。您提出的任何默认情况下未捕获或处理的异常都将被视为服务器错误,因此会给您 500.

如果你想让你的中间件 return 401 或 403,你可以像这样使用 django 的 HttpResponseHttpResponseForbidden

from django.http.response import HttpResponse, HttpResponseForbidden

class MyMiddlware:
    def process_request(request):
        try:
            decoded_token = auth.verify_id_token(id_token)
            uid = decoded_token['uid']
        except Exception:
            return HttpResponseForbidden('not authenticated')
       # or return HttpResponse('not authenticated', status=401)