自定义 Django Rest Framework 身份验证验证何时返回“无”

Posted

技术标签:

【中文标题】自定义 Django Rest Framework 身份验证验证何时返回“无”【英文标题】:Custom Django Rest Framework authentication validating when 'None' is returned 【发布时间】:2020-03-16 20:51:45 【问题描述】:

我正在努力实现 JWT 进行身份验证。当然,这意味着我必须进行一些自定义身份验证。根据docs,“如果未尝试身份验证,则返回None。”因此,我有代码检查授权标头(JWT 所在的位置),如果授权标头不存在,则返回“无”。这意味着没有尝试授权(并且根据文档)我应该返回None。但是,Django 表示用户已获得授权:

Root/身份验证/TokenAuthentication/TokenAuthentication


from rest_framework import status
from django.http import HttpResponse
from rest_framework.authentication import get_authorization_header, BaseAuthentication
from django.contrib.auth.models import User
import jwt, json

class TokenAuthentication(BaseAuthentication):

    def authenticate(self, request):
        auth = get_authorization_header(request).split()

        if not auth:
            return None

登录.py

@api_view(['POST'])
def login_view(request):
    if not request.data:
        return Response('Error': "Please provide username/password", status="400")

    username = request.data['username']
    password = request.data['password']

    try:
        user = User.objects.get(username=username)

        if not user.check_password(password):
            raise User.DoesNotExist

    except User.DoesNotExist: # if user not found or password is wrong
        return Response('Error': "Invalid username/password", status="400")

    if user.is_authenticated:
        print("user is authenticated") # THIS GETS PRINTED
    else:
        print("User is not authenticated")


Settings.py

REST_FRAMEWORK = 
    'DEFAULT_AUTHENTICATION_CLASSES': [
        #'rest_framework.authentication.BasicAuthentication',
        'Root.authentication.TokenAuthentication.TokenAuthentication'
    ]

线

 if user.is_authenticated:
        print("user is authenticated")

每次返回 None 时都会运行。

任何帮助将不胜感激。谢谢。

注意:如果重要的话,我正在使用 PyJwt。

【问题讨论】:

您是否在请求中添加了任何标头? 不,我没有。我是故意这样做的。通过不添加任何标头,该代码将运行并返回 None,但用户仍然经过身份验证。我认为用户不应该这样做。 【参考方案1】:

您正在使用 user.is_authenticated 来检查身份验证,其中 user 是您从数据库中提取的实例 。 应该是 request.user.is_authenticated

【讨论】:

以上是关于自定义 Django Rest Framework 身份验证验证何时返回“无”的主要内容,如果未能解决你的问题,请参考以下文章

python 使用Django Rest Framework在Django中自定义用户实现

Django rest framework 之 DictField、ListField、自定义字段

django-rest-framework 自定义视图集检索多个查找参数

Django Rest Framework 自定义身份验证

Django REST Framework 创建自定义用户

与 Django Rest Framework 的非用户连接的自定义身份验证