Получить токен авторизации, используя электронную почту вместо имени пользователя - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь получить токен авторизации, используя электронную почту вместо имени пользователя, я изменил сериализацию, чтобы принимать только электронную почту, но я думаю, что у меня что-то не так.

class AuthTokenSerializer(serializers.Serializer):
    """Serializer for user authentication object"""

    email_or_username = serializers.CharField()
    password = serializers.CharField(style = {'input_type' : 'password' }, trim_whitespace = False)

    def validate(self, attrs):
        """Validate and authentiate the user"""

        email_or_username = attrs.get('email')
        password = attrs.get('password')

        user = authenticate(request = self.context.get('request'), username = email, password = password)

        if not user:
            msg = _('Unable to authenticate with provided credentials.')
            raise serializers.ValidationError(msd, code='authorization')

        attrs['user'] = user

        return attrs

и вид

class LoginViewSet(viewsets.ViewSet):
    """Check email and password and returns an auth token."""

    serializer_class = serializers.AuthTokenSerializer
    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES

    def create(self, request):
        """Use the ObtainAuthToken APIview to validate and create a token."""

        return ObtainAuthToken().post(request)

когда я делаю тест

def test_create_token_for_user(self):
    """Test that a token is created"""

    parametrs = {'email' : 'test@noah-lc.com','email' : 'test@noah-lc.com', 'name' : 'test', 'password' : 'testPASS@123'}
    create_user(**parametrs)
    res = self.client.post(TOKEN_URL, parametrs)
    print(res.data)
    self.assertIn('token', res.data)
    self.assertEqual(res.status_code, status.HTTP_200_OK)

Я получил эту ошибку

AssertionError: 'token' не найден в {'username': [ErrorDetail (string = 'Это поле обязательно для заполнения.', Code = 'required')]}} 1013 *

Модель собственного пользователя

class UserProfile(AbstractBaseUser, PermissionsMixin):

    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'

И настройка

AUTH_USER_MODEL = 'core.UserProfile'

Ответы [ 2 ]

0 голосов
/ 07 января 2019

DRF ObtainAuthToken использует AuthTokenSerializer , который ожидает, что имя пользователя не является адресом электронной почты. Поэтому, если вы хотите использовать электронную почту, я бы посоветовал вам создать свой собственный ObtainAuthToken вид или, что еще лучше, поместить логику ObtainAuthToken прямо в ваш LoginViewSet, поскольку она, кажется, служит той же цели. Вы можете создать пользовательский AuthTokenSerializer, который будет принимать электронные письма вместо имени пользователя или обоих, и использовать с ним

0 голосов
/ 07 января 2019

Я полагаю, у вас есть приложение с именем users, а затем определите новую модель User здесь,

class User(AbstractBaseUser, PermissionMixin):

    first_name = models.CharField(max_length=100, blank=True, null=True)
    last_name = models.CharField(max_length=100, blank=True, null=True)
    email = models.EmailField(db_index=True, unique=True)

    USERNAME_FIELD = 'email'

Важная часть - USERNAME_FIELD, в которой вместо имени пользователя указывается адрес электронной почты

затем в settings.py добавьте строку ниже

AUTH_USER_MODEL = 'users.User'
...