Django 使用DRF JWT进行Allauth社交登录

Django 使用DRF JWT进行Allauth社交登录,django,jwt,django-allauth,Django,Jwt,Django Allauth,我正在Django应用程序中使用DRF、DRF-JWT、Allauth和Res-auth以及djangorestframework JWT刷新令牌 我有一个自定义JWT寄存器序列化程序来收集一些额外的用户信息,并创建和创建一个刷新令牌,用于刷新过期的JWT令牌。我们可以跨后端和iOS应用程序工作,在电子邮件注册方面没有问题。我现在正试图用allauth的SocialIn元素实现JWT,特别是作为提供商的Facebook 通过覆盖DefaultSocialAccountAdapter,我可以针对F

我正在Django应用程序中使用DRF、DRF-JWT、Allauth和Res-auth以及djangorestframework JWT刷新令牌

我有一个自定义JWT寄存器序列化程序来收集一些额外的用户信息,并创建和创建一个刷新令牌,用于刷新过期的JWT令牌。我们可以跨后端和iOS应用程序工作,在电子邮件注册方面没有问题。我现在正试图用allauth的SocialIn元素实现JWT,特别是作为提供商的Facebook

通过覆盖DefaultSocialAccountAdapter,我可以针对Facebook用户创建一个刷新令牌,但我很难用JWT和所述刷新令牌将JSON响应返回到移动客户端

这将创建刷新令牌:

class CustomSocialAccountAdapter(DefaultSocialAccountAdapter):
    def save_user(self, request, sociallogin, form):
    user = super(CustomSocialAccountAdapter, self).save_user(request, sociallogin, form)
    app = 'users'
    user.refresh_tokens.create(app=app)
    return user
我可以使用以下方法手动创建JWT:

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
我只是很难把这一切放在一起,我应该覆盖适配器还是使用pre_social_登录信号


感谢您的指点。

我使用以下方法返回了Facebook登录上的长寿命刷新令牌和头像url:

class CustomJWTSerializer(JWTSerializer):
    """
    OVERIDE JWTSerializer Base Serializer for JWT authentication to 
    add long refresh_token to returned JSON
    """
    refresh_token = serializers.CharField()
    avatar_url = serializers.CharField()



class FacebookLogin(SocialLoginView):

    adapter_class = FacebookOAuth2Adapter

    def process_login(self):
        get_adapter(self.request).login(self.request, self.user)

        user = self.request.user
            app = 'users'
            try:
                refresh_token = user.refresh_tokens.get(app=app).key
            except RefreshToken.DoesNotExist:
                refresh_token = None
            if refresh_token == None:
             app = 'users'
             user.refresh_tokens.create(
                app=app
             )
        preferred_avatar_size_pixels = 256
        facebook_social_account = SocialAccount.objects.get(user=user)
        uid = facebook_social_account.uid
        picture_url = "http://graph.facebook.com/{0}/picture?width={1}&height={1}".format(
        uid, preferred_avatar_size_pixels)
        profile = Profile(user=user, avatar_url=picture_url)
        profile.save()



    def get_response(self):
        serializer_class = CustomJWTSerializer
        refresh_token = RefreshToken.objects.get(user=self.user)
        profile = Profile.objects.get(user=self.user)
        avatar_url = profile.avatar_url

        if getattr(settings, 'REST_USE_JWT', False):
            data = {
                'user': self.user,
                'token': self.token,
                'refresh_token': refresh_token,
                'avatar_url': avatar_url
            }
            serializer = serializer_class(instance=data,
                                      context={'request': self.request})
        else:
            serializer = serializer_class(instance=self.token,
                                      context={'request': self.request})

        return Response(serializer.data, status=status.HTTP_200_OK)
我不知道这是否是正确的方法,但它现在起作用了