Как сгенерировать одноразовый пароль при создании пользователя и отправить его идентификатору почты в Django? - PullRequest
2 голосов
/ 15 октября 2019

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

Ответы [ 3 ]

3 голосов
/ 15 октября 2019

Я бы предложил другой подход к этому.

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

Не нужно создавать пароль, оставьте его пустым.

Вместо этого создайте URL со специальным токеном и отправьте URL. Если пользователь перейдет по этому URL-адресу, он предоставит форму для установки пароля для этого пользователя.

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

Вы можете взглянуть на PasswordResetTokenGenerator в django.contrib.auth.tokens, чтобы увидеть, как генерировать такие токены и изменять его соответствующим образом.

Вам также нужно будет сгенерировать URL, чтобы каким-то образом указать, какого пользователя использовать (возможно, затенить его). как-то как то не видно).

1 голос
/ 15 октября 2019

Я думаю, что есть простое решение для этого. Прежде всего позвольте мне описать пользовательскую модель с минимальными требованиями для задачи:

from django.contrib.auth.models import AbstractUser
# ... other import

class CustomUser(AbstractBaseUser):
  has_set_password = models.BooleanField(default=False)
  # ... other fields

С другой стороны, если вы не хотите загрязнять модель ненужными полями, проверьте значение last_loginполе, которое исходит из модели AbstractUser, и его значение должно быть None, если пользователь еще не вошел в систему.

После части выше, я бы определил метод post save длямодель CustomUser или в представлении, где создается пользователь - я бы просто назначил случайный одноразовый пароль. После того, как пользователь войдет в систему, я бы проверил флаг has_set_password, если это False, перенаправить его, чтобы установить новый пароль (или сделать что-то еще), если это будет True, просто войдите в систему.

Надеюсь, это помогает.

0 голосов
/ 15 октября 2019

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

from random import SystemRandom    

def user_create(username):
    new_random_obj = SystemRandom()
    #generate: 6 digits pin
    pin = new_random_obj.randrange(100000, 999999)

    user = User.objects.create_user(username=username, password=pin)

Тогда ваш метод create_user в UserManager может выглядеть как

 def create_user(self, username, password=None, location=None):
        if not username:
            raise ValueError('User must have an username')

        user = self.model(
            username=username
        )

        user.set_password(password)
        user.save(using=self._db)
        return user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...