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):
# ...
我正在尝试将 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):
# ...