gpt4 book ai didi

python - 将自定义用户身份验证添加到 django-rest-framework-simple-jwt

转载 作者:行者123 更新时间:2023-12-03 23:48:08 25 4
gpt4 key购买 nike

我想通过一次性密码以及 django 中常用的用户名/密码方法添加用户登录。为此,用户名/密码或用户名/OTP 从客户端发送到服务器,并根据提供的一对字段,如果用户通过身份验证,我需要返回访问和刷新 token 。我正在使用 django 的 simple-jwt。我知道我必须覆盖 TokenObtainPairView 和 TokenObtainSerializer。问题是,我想自己做字段验证部分。

在我的 View 中,我覆盖了 simple-jwt 的默认 View 。

#views.py

class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer

我覆盖了如下所示的序列化程序:
#serializers.py

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):

def validate(self, attrs):
try:
request = self.context["request"]
except KeyError:
pass

try:
request_data = json.loads(request.body)
if("username" in request_data and "password" in request_data):
# default scenario in simple-jwt
pass
elif("username" in request_data and "otp" in request_data):
# validate username/otp manually and return access/token pair if successful
pass

else:
# some fields were missing
raise serializers.ValidationError({"username/otp or username/password" : "These fields are required"})

except:
pass

因此,如果客户端以以下可能的形式之一传递用户凭据,我将能够对其进行身份验证并返回 token 对。
{
"username" : "Winston",
"password" : "testpass"
}

或者
{
"username" : "Winston",
"otp" : "testotp"
}

问题是,当我以第二种形式发送数据时,我得到 400 BadRequest:password is required .如何自定义字段及其验证?

最佳答案

Saiful Azad在评论中提到,一种可能的方法是为每个场景使用单独的序列化程序。

#views.py

class MyTokenObtainPairView(TokenObtainPairView):
def get_serializer_class(self):
if ("otp" in self.request.data):
return MyTokenObtainPairSerializer
return TokenObtainPairSerializer
然后,您可以实现自己的序列化程序以进行 otp 验证。我用过 simple-jwt's implementation实现我自己的序列化程序并使用我的自定义身份验证方法。

关于python - 将自定义用户身份验证添加到 django-rest-framework-simple-jwt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61229478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com