Я хочу добавить логин пользователя с помощью одноразового пароля, а также обычный метод имени пользователя / пароля в django. Чтобы сделать это, имя пользователя / пароль или имя пользователя / OTP отправляются от клиента к серверу и на основе предоставленной пары полей, мне нужно вернуть доступ и обновить токен sh, если пользователь прошел проверку подлинности. Я использую django's simple-jwt. Я знаю, что мне нужно переопределить TokenObtainPairView и TokenObtainSerializer. Проблема в том, что я хочу выполнить часть проверки поля самостоятельно.
В своих представлениях я переопределяю представление по умолчанию simple-jwt.
#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
Таким образом, если клиент передаст учетные данные пользователя в одной из приведенных ниже форм, я смогу аутентифицировать ее и вернуть пару токенов.
{
"username" : "Winston",
"password" : "testpass"
}
или
{
"username" : "Winston",
"otp" : "testotp"
}
Проблема в том, что когда я отправляю данные во второй форме, я получаю 400 BadRequest:password is required
. Как я могу настроить поля и их проверку?