Django) "аутентифицируется" с пользовательской моделью, извлеченной сторонней моделью
Я занимаюсь разработкой модуля проверки электронной почты.
Прежде всего, у меня есть модель с именем "SNUser", имеющая отношение "один к одному" со стандартной моделью "пользователя", приведенной ниже:
class SNUser(models.Model):
# Manager
objects = SNUserManager()
# Auth
user = models.OneToOneField(User, unique=True, primary_key=True)
Я закончил отправку электронного письма, содержащего уникальный токен для пользователя.
Когда щелкала ссылка, я искал правильный объект SNUser по токену (этот токен является одним из полей модели SNUser).
Итак, что я хочу разработать, так это то, что при щелчке по ссылке токена правильный пользователь может использовать сервис без входа в систему.
Поэтому, когда по этой ссылке нажимают, "логин (запрос, пользователь)" должен быть сделан.
Я уже попробовал два способа решить эту проблему.
когда я извлек пользовательскую модель из модели SNUser и сделал "вход в систему (запрос, пользователь)" напрямую:
snuser = SNUser.objects.get (токен = ключ)
user = snuser.user
логин (запрос, пользователь) Это приводит к ошибке: анонимный пользователь.
- После извлечения пользователя по умолчанию из модели SNUser я сделал "аутентификацию (username=user.username, password=user.password)". Но многие из вас уже заметили, user.password - это хэши, а не сырье. Так что опять не получается.
Моя цель - извлечь пользователя из токена, включенного в отправленную мной ссылку, и заставить его / ее использовать службу без модуля входа в систему, поскольку многие службы следуют этому процессу.
Есть ли способ решить этот вопрос?
Спасибо!
**** ОБНОВИТЬ ****
Я создал пользовательский бэкэнд, не требующий необработанного пароля для моей ситуации ниже:
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
Обновленный критический код в views.py ниже:
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)
Вышеупомянутая строка работает (это означает, что пользователь успешно вошел в систему), но выдает ошибку одновременно: у объекта 'User' нет атрибута 'backend'
**** УДАЛИТЕ ДУБЛИРОВАННУЮ МАРКУ ****
1 ответ
Это было решено с помощью user.backend=None.
Я ссылался на аутентификацию функции в Django, используя хешированный пароль, а не сырой
Я хотел бы, чтобы это было полезно для любого, кто ссылается на этот пост.