Django:令牌身份验证不适用于@api_view

Django: Token Authentication isn't working with @api_view

我正在尝试将 JWT 令牌身份验证应用于我的 Django 应用程序。我正在学习本教程 https://simpleisbetterthancomplex.com/tutorial/2018/12/19/how-to-use-jwt-authentication-with-django-rest-framework.html

我添加了这些设置

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

然后我添加了身份验证检查 api_view

# views.py
@api_view(['GET', 'POST'])
@authentication_classes([authentication.TokenAuthentication])
@permission_classes([permissions.IsAuthenticated])
def task(request):
    if request.method == 'POST':
        if "type" in request.data:
            category_name = request.data["type"]
            task = create_task.delay(category_name)
            return Response({"message": "Create task", "task_id": task.id, "data": request.data})
        else:
            return Response({"message": "Error, not found 'type' in POST request"})

然后我有一个错误:

"Authentication credentials were not provided."

对于以下请求:

如何修复错误?

在您看来,您正在使用 TokenAuthentication 覆盖身份验证 classes,这反过来需要在授权 header 中使用 Token 而不是 JWT ].

要修复,只需删除您视图中的 @authentication_classes 装饰器:

@api_view(['GET', 'POST'])
@permission_classes([permissions.IsAuthenticated])
def task(request):
    # ...

这将导致您的视图使用 DEFAULT_AUTHENTICATION_CLASSES 设置中的身份验证 classes。

或者,如果您想继续使用装饰器,只需确保您使用的是正确的身份验证 class:

from rest_framework_simplejwt import authentication


@api_view(['GET', 'POST'])
@authentication_classes([authentication.JWTAuthentication]) # correct auth class
@permission_classes([permissions.IsAuthenticated])
def task(request):
    # ...

我认为您在 header 中将 JWT 作为令牌发送,但我认为您需要拥有 Bearer 令牌。尝试更改可能应该有效。