2017-01-12 3 views
0

У меня есть этот код:Джанго Войти AttributeError: объект «AnonymousUser» не имеет атрибута «_meta»

from django.contrib.auth import logout, login, authenticate 
... 
    if User.objects.filter(email=email).exists(): 
     existing_user = User.objects.get(email=email) 

     user = authenticate(username=existing_user.username, password=existing_user.password) 

     login(request, user) 

Согласно документации, это должно работать, но это не так, он дает мне ошибку:

request.session[SESSION_KEY] = user._meta.pk.value_to_string(user) AttributeError: 'AnonymousUser' object has no attribute '_meta'

Возможно, проблема возникает, потому что я использую аутентификацию JWT с помощью Django Rest Framework? Это просто API-интерфейс с поддержкой django, поэтому я думаю, что это другой сценарий, но я не понимаю, что может вызвать проблему.

+4

Показать полный обзор. Но ваш код ** не имеет смысла **; 'authenticate' - это то, что получает пользователь, сравнивая с * хэшированным * паролем, сохраненным в базе данных. Нет смысла вводить пользователя отдельно, и здесь 'authenticate' будет * всегда * терпеть неудачу. –

+0

Hi @DanielRoseman. Тогда как я могу войти в систему пользователя в представлении, не имея своего пароля? Приложение отправляет мне токен facebook, я подтверждаю токен с API-интерфейсом Fb, затем я получаю сообщение электронной почты и проверяю, существует ли он (остальное находится в вставленном мной коде), если пользователь с этим письмом существует, мне нужно для входа в систему этого пользователя. Я думал, что использование 'authenticate' и' login' решит его, но теперь я вижу, что это не так. – alejoss

+2

Вы можете реализовать свой собственный интерфейс аутентификации для аутентификации пользователя без пароля. Здесь приведен пример аутентификации с токеном - https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#writing-an-authentication-backend. –

ответ

1

В DRF пользователь должен быть аутентифицирован внутри класса аутентификации. This библиотека предоставляет один для JWT auth. Он обеспечивает генерацию и проверку токенов.

Вы получите пользователя как self.request.user в классе View или ViewSet. Вам просто нужно разрешить JWT авторизацию:

class ExampleView(APIView): 
    authentication_classes = (BasicAuthentication, JSONWebTokenAuthentication) 

Или лучше набор является столь же DEFAULT_AUTHENTICATION_CLASSEShere как документировано.