0

我知道如何使用simplejwt. 现在我想在用户注册后在包含电子邮件的令牌中返回自定义声明。我该怎么做呢?

我的序列化器:

class CreateUserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(min_length=8, required=True, write_only=True)
    password2 = serializers.CharField(min_length=8, write_only=True, required=True)
    tokens = serializers.SerializerMethodField()

    def get_tokens(self, user):
        refresh = RefreshToken.for_user(user)

        return {
            'refresh': str(refresh),
            'access': str(refresh.access_token),
        }
    
    def validate(self, data):
        if data['password'] != data['password2']:
            raise serializers.ValidationError({"password": "Password fields didn't match."})
        return data

    def create(self, validated_data):
        password = validated_data.pop('password', None)
        password2 = validated_data.pop('password2', None)
        
        instance = self.Meta.model(**validated_data)

        if password is not None:
            instance.set_password(password)
        instance.save()
        return instance

    class Meta:
        model = CustomUser
        fields = ('id', 'email', 'password', 'password2', 'tokens')
        extra_kwargs = {'password': {'write_only': True}}

它返回默认的 JWT 访问和刷新令牌。我想在此处的令牌中返回自定义声明。

风景:

class CreateUserView(generics.CreateAPIView):
    permission_classes = [permissions.AllowAny]

    def create(self, request, *args, **kwargs):
        serializer = CreateUserSerializer(data = request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
4

1 回答 1

0

我想到了。我只需要在get_tokens()我的序列化程序的现有功能中进行此更改:

def get_tokens(self, user):
        refresh = RefreshToken.for_user(user)
        refresh['email'] = user.email

        return {
            'refresh': str(refresh),
            'access': str(refresh.access_token),
        }

email是我的补充声明。

于 2021-01-28T17:08:29.983 回答