Добавление пользовательской аутентификации пользователя в django -rest-framework-simple-jwt - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу добавить логин пользователя с помощью одноразового пароля, а также обычный метод имени пользователя / пароля в 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. Как я могу настроить поля и их проверку?

1 Ответ

1 голос
/ 19 апреля 2020

Поскольку Saiful Azad упоминается в комментариях, одним из возможных способов является использование отдельных сериализаторов для каждого из сценариев ios.

#views.py

class MyTokenObtainPairView(TokenObtainPairView):
    def get_serializer_class(self):
        if ("top" in self.request.data):
            return MyTokenObtainPairSerializer
        return TokenObtainPairSerializer

Затем вы можете реализовать свой собственный сериализатор для проверки otp. Я использовал реализацию simple-jwt , чтобы реализовать свой собственный сериализатор и использовать собственный метод аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...