Django Rest框架+ SimpleJWT在未受保护的路由上返回401

lokaqttq  于 2022-12-20  发布在  Go
关注(0)|答案(1)|浏览(246)

我已经配置了DRF使用JWT作为验证方案,并且大部分都能正常工作,但是当用户的令牌和刷新令牌不再有效时,而不是返回200作为未受保护路由的未授权用户,并显示网站,好像他们不再登录后端返回401。中间件设置,但我的假设是,如果默认值是AllowAny,则会忽略一个错误的令牌。是否有我遗漏的配置?
来自DRF文件
如果未指定,此设置默认为允许无限制访问:
“默认许可类别”:[
'rest_framework.权限.允许任何人',]
我的settings.py

REST_FRAMEWORK = {
    ...
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework.authentication.BasicAuthentication",
        "rest_framework_simplejwt.authentication.JWTAuthentication",
    ),
}

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": datetime.timedelta(minutes=15),
    "REFRESH_TOKEN_LIFETIME": datetime.timedelta(days=2),
    ...
}

ViewSet示例返回带有错误访问令牌的401

class PromoApiSet(ViewSet):
    serializer_class = PromoSerializer

    def get_queryset(self, *args, **kwargs):
        time_now = timezone.now()
        return PromoNotification.objects.filter(
            end_date__gte=time_now, start_date__lte=time_now
        )

    # @method_decorator(cache_page(120))
    def list(self, request):
        promos = self.get_queryset()

        serializer = self.serializer_class(promos, many=True)
        promos_data = serializer.data

        response_data = {"promos": promos_data}

        return Response(response_data)
xxhby3vn

xxhby3vn1#

无效、格式错误或其他不正确的凭据将引发401,请参阅JWTAuthentication类的源代码。

  • JWT身份验证.get_user
  • 令牌无效

这对我来说是有意义的,但是如果您希望行为是“如果有错误,则静默地忽略此头”,那么您需要重写该方法,并且忽略错误:

class MyJWTAuth(JWTAuthentication):
    def authenticate(self, request):
        try:
            return super().authenticate(self, request)
        except (InvalidToken, AuthenticationFailed):
            return None

# in your settings, use your new class
"DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework.authentication.BasicAuthentication",
        "my.project.module.MyJWTAuth",
),

这是可行的,但我不推荐它。如果你想更细粒度地“忽略”特定的错误,那么你需要覆盖更多的功能,或者提供类并直接进行修改。

相关问题