【问题标题】:username and email interchanged for social user为社交用户交换用户名和电子邮件
【发布时间】:2021-12-10 18:48:57
【问题描述】:

我正在使用 google oauth2 进行社交身份验证,我获取了用户的用户名和电子邮件并将其保存在我的模型上,但用户名和电子邮件字段正在交换。是什么导致了这样的问题?

models.py

class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(max_length=255, db_index=True)
    email = models.EmailField(max_length=255, unique=True, db_index=True)
    is_verified = models.BooleanField(default=False)
    # is_authenticated = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    auth_provider  = models.CharField(max_length=225, blank=False, null=False, default=AUTH_PROVIDERS.get('email'))

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']
    objects = UserManager()

    def __str__(self):
        return self.email

    def tokens(self):
        refresh = RefreshToken.for_user(self)
        return {
            'refresh': str(refresh),
            'access': str(refresh.access_token)
        }

注册.py

def register_social_user(provider, user_id, email, name):
    filtered_user_by_email = User.objects.filter(email=email)

    if filtered_user_by_email.exists():
        
        if provider == filtered_user_by_email[0].auth_provider:

            registered_user = authenticate(
                email=email, password=os.environ.get('SOCIAL_SECRET'))

            return {
                'username': registered_user.username,
                'email': registered_user.email,
                'tokens': registered_user.tokens()}

        else:
            raise AuthenticationFailed(
                detail='Please continue your login using ' + filtered_user_by_email[0].auth_provider)

    else:
        user = {
            'username': generate_username(name), 'email': email,
            'password': os.environ.get('SOCIAL_SECRET')}
        user = User.objects.create_user(**user)
        user.is_verified = True
        user.auth_provider = provider
        user.save()
        print('user',user)

        new_user = authenticate(
            email=email, password=os.environ.get('SOCIAL_SECRET'))
        print ('new:',new_user)
        return {
            'id':user.id,
            'email': user.email,
            'username': user.username,
            'tokens': user.tokens()
        }

这里是完整代码的链接:https://github.com/abinashkarki/rest_framework_authentication

【问题讨论】:

    标签: django django-rest-framework google-oauth python-social-auth


    【解决方案1】:

    我运行createsuperuser 命令,我看到它将电子邮件值保存到用户名字段中,反之亦然。 我在您的自定义UserManager 中发现了问题,您在UserManager.create_user 方法中写错了用户名和电子邮件字段的顺序:

    def create_user(self, username, email, password=None, **extra_fields):
        return self._create_user(email, username, password, **extra_fields)
    
    def create_superuser(self, username, email, password=None, **extra_fields):
        user = self.create_user(username, email, password)
        user.is_superuser = True
        user.is_staff = True
        user.has_delete_permission = True
        user.save()
        return user
    

    你应该做的基本上是像这样修复create_user方法:

    def create_user(self, username, email, password=None, **extra_fields):
        return self._create_user(username, email, password, **extra_fields)
    

    现在应该可以工作了

    【讨论】:

    • 如果是这样,那么在从 serializers.py 对用户进行身份验证以在 authapp/serializers.py 上正常登录时,为什么我不会遇到同样的问题? (只是想深入理解问题)
    • 几个小时后再看,你可以看this
    • 我找到了问题的根源并编辑了答案@AbinashKarki
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2023-03-08
    • 2019-07-17
    • 1970-01-01
    • 2021-01-19
    • 2022-01-01
    相关资源
    最近更新 更多