0

我正在尝试解决用户注册时用户自动登录并返回该用户的令牌的用例,以便我可以从前端的 cookie 中获取该令牌。但是,我得到了问题"Email already registered"。当我使用 pdb 调试我的代码时,我发现它auth = authenticate(username=email, password=password)返回 None。

如何在注册期间对用户进行身份验证并传递该用户的令牌?

这就是我正在做的事情

class Register(graphene.Mutation):
    '''
        Mutation to register a user
    '''
    class Arguments:
        email = graphene.String(required=True)
        password = graphene.String(required=True)
        password_repeat = graphene.String(required=True)

    success = graphene.Boolean()
    errors = graphene.List(graphene.String)
    email = graphene.String()

    def mutate(self, info, email, password, password_repeat):
        if password == password_repeat:
            try:
                serializer = RegistrationSerializer(data={
                    'email': email,
                    'password': password,
                    'is_active': False
                })
                if serializer.is_valid():
                    user = serializer.save()
                    auth = authenticate(username=email, password=password)
                    import pdb
                    pdb.set_trace()
                    # login user and pass the token
                    login(info.context, auth)
                    return Register(success=bool(user.id), email=user.email)
                else:
                    print("error", serializer.errors)
            except Exception:
                errors = ["email", "Email already registered"]
                return Register(success=False, errors=errors)
            errors = ["password", "Passwords don't match."]
            return Register(success=False, errors=errors)


class Login(graphene.Mutation):
    """
    Mutation to login a user
    """
    class Arguments:
        email = graphene.String(required=True)
        password = graphene.String(required=True)

    success = graphene.Boolean()
    errors = graphene.List(graphene.String)
    token = graphene.String()
    user = graphene.Field(UserQuery)

    def mutate(self, info, email, password):
        user = {'email': email, 'password': password}
        serializer = JSONWebTokenSerializer(data=user)
        if serializer.is_valid():
            token = serializer.object['token']
            user = serializer.object['user']
            print('user', user)
            return Login(success=True, user=user, token=token)
        else:
            print("serializers errors", serializer.errors)
            return Login(
                success=False,
                token=None,
                errors=['email', 'Unable to login with provided credentials.']
            )

注册序列化器

class RegistrationSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'email', 'is_active', 'password', )

    def create(self, validated_data):
        print("validated_data", validated_data)
        user = User.objects.create(**validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user

我正在使用 graphql 而不是 REST API,并且我正在使用 graphene-django 作为 graphql。

4

0 回答 0