Django) "аутентифицируется" с пользовательской моделью, извлеченной сторонней моделью

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

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

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

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

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

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

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

Поэтому, когда по этой ссылке нажимают, "логин (запрос, пользователь)" должен быть сделан.

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

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

    snuser = SNUser.objects.get (токен = ключ)

    user = snuser.user

    логин (запрос, пользователь) Это приводит к ошибке: анонимный пользователь.

  2. После извлечения пользователя по умолчанию из модели 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, используя хешированный пароль, а не сырой

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

Другие вопросы по тегам