【问题标题】:DRF exception 'NotAuthenticated' raising 500 Internal Server Error in place of 401/403DRF 异常“未验证”引发 500 内部服务器错误代替 401/403
【发布时间】:2021-07-10 19:09:27
【问题描述】:

我有一个 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 块捕获。但不是引发 401/403 错误,而是由 NotAuthenticated 引发 500 Internal Server Error。

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

【问题讨论】:

  • 确保 raise 发送的响应是 json 格式。您能否分享控制台日志中显示的确切错误消息,
  • exceptions.NotAuthenticated(detail='not authenticated') 将创建一个字符串对象,而不是您需要一个 json 对象,尝试使用 detail={"error": "not authenticated"}

标签: python django django-rest-framework http-error django-middleware


【解决方案1】:

DRF handles sending status code 401 or 403 取决于您的视图引发的异常(NotAuthenticatedPermissionDenied)。

但由于您使用的是中间件,因此 DRF 已经不适用了。您引发的任何默认情况下未捕获或处理的异常都将被视为服务器错误,因此会给您一个500

如果您希望您的中间件返回 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2021-12-02
    • 2022-08-17
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多