Я пытаюсь переназначить django -rest-framework-simplejwt для совершенно другой аутентификации (номер телефона и код подтверждения SMS в двух разных запросах). Дело в том, что у меня все разработано, но из-за тесной интеграции этой системы аутентификации в проекте мне пришлось бы вручную запускать TokenObtainPairView, чтобы пользователь все еще получал токен и проходил аутентификацию в системе.
Есть есть ли способ сделать это? Я думал о том, чтобы запустить представление вручную, но это не сработает, поскольку даже если я настрою сериализатор для этого представления, я не могу переопределить стандартное имя пользователя / пароль для пользователя (у пользователя нет пароля, а имя пользователя Случайно)
Есть идеи, как это сделать?
Мой текущий код такой:
class LoginResource(APIView):
permission_classes = (permissions.AllowAny,)
def post(self, request):
payload = json.loads(request.body)
try:
profile = UserProfile.objects.get(phone=payload.get('phone', ''))
code = codegenerator()
profile.authentication_code = code
profile.save()
# TODO: Send the generated code over SMS
send_mail(
'Your authentication code',
'Your authentication code is: {}'.format(code),
settings.EMAIL_SEND_FROM,
(profile.email,),
fail_silently=False,
)
payload = {
"status": "success"
}
return JsonResponse(payload, status=200, safe=False)
except Exception as e:
payload = {
"status": "error",
"message": "Unable to obtain the user: {}".format(e)
}
return JsonResponse(payload, status=500, safe=False)
class ValidateCodeAndLogin(APIView):
permission_classes = (permissions.AllowAny,)
def post(self, request):
payload = json.loads(request.body)
try:
profile = UserProfile.objects.get(phone=payload.get('phone', ''))
code = payload.get('validation_code', 'INVALID')
if code == profile.authentication_code:
profile.validated = True
profile.authentication_code = ''
profile.save()
#
# TODO: Return the JWT token
#
else:
payload = {
"status": "error",
"message": "Invalid authentication code"
}
return JsonResponse(payload, status=401, safe=False)
except Exception as e:
payload = {
"status": "error",
"message": "Unable to obtain the user: {}".format(e)
}
return JsonResponse(payload, status=500, safe=False)