Django : Установите флаг is_active для пользователя, созданного с помощью social-auth-app-django и google_oauth2

Я использую social-auth-app-django для регистрации новых пользователей с использованием аутентификации google oauth2.

После регистрации новый пользователь создается в моей базе данных, но is_active установлен как false, я хочу установить is_active как true только для пользователей, созданных этой аутентификацией social_auth google

(для других пользователей, которые регистрируются с помощью email-пароля, я активирую их, отправляя письмо с активацией аккаунта). Я пробовал установить is_active = True для всех пользователей без пароля, но я чувствую, что этот способ небезопасен и хакерский. Как мне изменить поток social_auth_login для активации пользователей? Я использую пользовательскую модель User :

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']

..

Согласно Django, булево is_active

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

В вашем случае, я бы поставил is_active по умолчанию значение True (если вы хотите удалить аккаунт, вы просто ставите значение False).

Следуя вашему замечанию

(для других пользователей, которые регистрируются с помощью email-пароля, я активирую их путем посылаю письмо с активацией аккаунта)

вы можете добавить булево значение is_email_verified: если пользователь создан с помощью social auth, то is_email_verified равно True; если пользователь создан с помощью email-пароля, то is_email_verified равно False и должно быть установлено значение True путем отправки письма активации аккаунта.

Благодаря этому вы можете иметь 4 состояния с двумя булевыми значениями is_active и is_email_verified: пользователь, который хочет подключиться, должен иметь оба значения True. Мне кажется, это безопасно.

Вернуться на верх