Используйте электронную почту вместо имени пользователя для аутентификации пользователя

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Я знаю, что в этом ответе есть много ответов и много разных способов сделать это, но на сегодняшний день в Django 3 я хочу знать, какой из них является лучшим и надежным способом использовать только электронную почту для аутентификации.

РЕДАКТИРОВАТЬ: я нашел ссылку, но не подтвердил, есть ли у нее какие-либо недостатки

https://www.fomfus.com/articles/how-to-use-email-as-username-for-django-authentication-removing-the-username

Комментарии:

1. Если вы когда-либо пытались решить свою проблему, то вы можете поделиться своим кодом здесь, чтобы посмотреть, где вы застряли.

2. @xxnora пожалуйста, проверьте, что я отредактировал вопрос

Ответ №1:

Вы можете создать свой пользовательский, serializers а затем поместить логику для проверки через authenticated by email следующим образом:

serializers.py :

 
from rest_framework import serializers
from django.db.models import Q
from django.contrib.auth import get_user_model
User = get_user_model()

class UserLoginSerializers(serializers.ModelSerializer):
    email = serializers.CharField()
    password = serializers.CharField(write_only=True)
    class Meta:
        model = User
        fields = [
            "email",
            "password",
        ]

    def validate(self, data):
        email = data['email']
        password = data['password']
        user_queryset = User.objects.filter(Q(email__iexact=email) | Q(username__iexact=email)).distinct()

        if user_queryset.exists() and user_queryset.count() == 1:
            user_set = user_queryset.first()
            if user_set.check_password(password):
                user = user_set
                print(user)

            else:
                raise serializers.ValidationError("Incorrect Password!")

        else:
            raise serializers.ValidationError("Not Valid User!")

        return data

  

views.py :

 from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.status import (
    HTTP_200_OK, HTTP_201_CREATED, HTTP_400_BAD_REQUEST
    )
from .serializers import (UserLoginSerializers)

class UserLoginAPIView(APIView):
    serializer_class = UserLoginSerializers

    def post(self, request, format=None):
        data = request.data
        user_serilaizer = UserLoginSerializers(data=data)
        if user_serilaizer.is_valid():
            new_data = user_serilaizer.data
            return Response(new_data, status=HTTP_200_OK)
        else:
            return Response({"msg":"invalid user"}, status=HTTP_400_BAD_REQUEST)

  

urls.py :

 from django.urls import path

from account.api.views import (UserLoginAPIView)

urlpatterns = [
    path('api/login', UserLoginAPIView.as_view(), name='login_api'),
]
  

Комментарии:

1. Это решило ваш вопрос? если это так, пожалуйста, примите это как ответ. так что другие люди могут быть полезны. спасибо 🙂

Ответ №2:

from_the_docs:

ИМЯ_ПОЛЬЗОВАТЕЛЯ

Строка, описывающая имя поля в модели пользователя, которое используется в качестве уникального идентификатора. Обычно это какое-либо имя пользователя, но это также может быть адрес электронной почты или любой другой уникальный идентификатор.