2016-07-27 10 views
0

Я разрабатываю модуль проверки электронной почты.Django) 'authenticate' с моделью пользователя, полученной иностранной моделью

Прежде всего, у меня есть модель под названием «SNUser» с «один к одному» отношения с моделью по умолчанию «пользователя» ниже:

class SNUser(models.Model): 
# Manager 
    objects = SNUserManager() 

# Auth 
    user = models.OneToOneField(User, unique=True, primary_key=True) 

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

Когда ссылка нажата, я искал нужный объект SNUser токеном. (Этот токен является одним из полей модели SNUser).

Итак, что я хочу разработать, так это то, что при нажатии этой ссылки токена правильный пользователь может использовать услугу без входа в систему.

Поэтому, когда нажимается эта ссылка, необходимо выполнить 'login (request, user)'.

Я уже пробовал два способа решить эту проблему.

  1. , когда я извлек пользовательскую модель из модели SNUser и сделал 'Логин (запрос, пользователь)' непосредственно:

    snuser = SNUser.objects.get (маркер = ключ)

    user = snuser.user

    login (request, user) Результаты с ошибкой: Анонимный пользователь.

  2. После извлечения пользователя по умолчанию из модели SNUser я выполнил 'authenticate (username = user.username, password = user.password)'. Но многие из вас уже заметили, что user.password - это хеширование, а не простое. Так что это снова не срабатывает.

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

Есть ли способ решить эту проблему?

Спасибо!

**** **** UPDATE

Я создал пользовательский бэкенд не требует сырого пароля для моей ситуации ниже:

class SNUserEmailVerificationAuthBackend(ModelBackend): 

def authenticate(self, username=None, email=None): 
    try: 
     return User.objects.get(username=username, email=email) 
    except User.DoesNotExist: 
     return None 

def get_user(self, username): 
    try: 
     return User.objects.get(username=username) 
    except User.DoesNotExist: 
     return None 

Обновленных критический кода во взглядах.ру ниже:

  snuser.is_email_verified = True 
      snuser.save() 
      user = snuser.user 
      manager=SNUserEmailVerificationAuthBackend() 
      new_user=manager.authenticate(username=user.username,email=user.email) 
      login(request,new_user) 

Логин (запрос, new_user)

Выше линии работает (это означает suceeds пользователя в Вход для реселлеров в), но поднимая ошибку одновременно: объект «Пользователь» не имеет атрибута ' бэкенд»

**** дублированы MARK REMOVE ****

+0

Как вы импортировали 'login'? Откуда у вас ошибка? Пожалуйста, покажите полную трассу. – Alasdair

+0

Я использовал встроенную библиотеку django 'из django.contrib.auth import authenticate, login' – LKM

+0

@Alasdair Я обновил – LKM

ответ

0

Она была решена с 'user.backend = None'.

Я refered к authenticate function in django using hashed password not the raw one

Я хотел было бы полезно для тех, кто Отсносящихся этого поста.

+0

И это вызывает clouse сеанса, когда текущая страница перенаправляется в любую точку ... – LKM

+0

Непосредственное закрытие сеанса решается пользовательским бэкэнд. – LKM

Смежные вопросы