#django #django-forms #social-auth-app-django
Вопрос:
Я использую social-auth-app-django для регистрации новых пользователей с использованием аутентификации Google oauth2.
после регистрации в моей базе данных создается новый пользователь, но значение is_active установлено как false, я хочу установить is_active
значение true только для пользователей, созданных с помощью этой аутентификации google social_auth
(для других пользователей, которые регистрируются с помощью пароля электронной почты, я активирую их, отправив электронное письмо для активации учетной записи) Я попытался установить значение is_active = True для всех пользователей без пароля , но я чувствую, что этот способ небезопасен и хакерский . Как мне изменить поток social_auth_login, чтобы также активировать пользователей ? Я использую пользовательскую модель пользователя :
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The Email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
if password:
user.set_password(password)
# else:
# user.is_active = True <-------- tried this , worked too
user.save()
return user
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_active', True)
extra_fields.setdefault('user_type', user_constants.SUPERUSER)
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, password, **extra_fields)
..
class User(AbstractUser):
username = None # remove username field, we will use email as unique identifier
email = models.EmailField(unique=True, null=True, db_index=True)
client_id = models.UUIDField(primary_key = True,
default = uuid.uuid4,
editable = False)
name = models.CharField(max_length=255, default="")
is_active = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(default=timezone.now)
user_type = models.PositiveSmallIntegerField(choices=user_constants.USER_TYPE_CHOICES, default=user_constants.CLIENT_ADMIN)
REQUIRED_FIELDS = []
USERNAME_FIELD = 'email'
objects = UserManager()
..
SOCIAL_AUTH_PIPELINE = (
'social_core.pipeline.social_auth.social_details',
'social_core.pipeline.social_auth.social_uid',
'social_core.pipeline.social_auth.auth_allowed',
'social_core.pipeline.social_auth.social_user',
'social_core.pipeline.user.get_username',
'social_core.pipeline.social_auth.associate_by_email',
'social_core.pipeline.user.create_user',
'social_core.pipeline.social_auth.associate_user',
'social_core.pipeline.social_auth.load_extra_data',
'social_core.pipeline.user.user_details',
)
SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL = True
SOCIAL_AUTH_USER_MODEL = 'register.User'
SOCIAL_AUTH_GOOGLE_OAUTH2_USER_FIELDS = ['email']
..
Ответ №1:
Согласно Джанго, логическое is_active
определяет, следует ли считать эту учетную запись пользователя активной. Мы рекомендуем установить этот флаг в значение False вместо удаления учетных записей; таким образом, если в ваших приложениях есть какие-либо внешние ключи для пользователей, внешние ключи не будут нарушены.
В вашем случае я бы поставил is_active
значение True по умолчанию (если вы хотите удалить учетную запись, вы просто ставите значение False).
Следуя вашему замечанию
(для других пользователей, которые регистрируются с помощью пароля электронной почты, я активирую их, отправив электронное письмо для активации учетной записи)
вы можете добавить логическое is_email_verified
значение : если пользователь создан с помощью социальной аутентификации, это означает is_email_verified
, что это Правда; если пользователь создан по паролю электронной почты, is_email_verified
он является ложным и должен быть установлен в значение True, отправив электронное письмо для активации учетной записи.
Благодаря этому у вас может быть 4 состояния с 2 логическими is_active
значениями и is_email_verified
: пользователь, который хочет подключиться, должен иметь оба из них как истинные. Мне это кажется безопасным.