프로젝트

소셜계정 선택 로직 업데이트

content0474 2025. 1. 17. 20:50

상황: 회원가입 후 default_social_provider는 설정되었지만, connected_social_providers와 is_social_connected 상태가 업데이트되지 않아 사용자가 소셜 계정을 연동했음에도 연결되지 않은 상태로 보이는 문제가 발생

 

{
    "is_social_connected": false,
    "connected_social_providers": [],
    "default_social_provider": "kakao"
}

 

원인: preferences에서 소셜 계정을 선택해도 connected_social_providers와 is_social_connected 상태를 업데이트하는 로직이 없었음.

 

기존코드

class DashboardCompleteView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        user = request.user
        messenger_platform = request.data.get("messenger_platform")
        category_ids = request.data.get("categories", [])

        if messenger_platform:
            user.default_social_provider = messenger_platform
        
        if category_ids:
            valid_categories = Category.objects.filter(id__in=category_ids)
            if not valid_categories.exists():
                return Response({"error": "유효하지 않은 카테고리 ID입니다.", "redirect_url": None}, status=status.HTTP_400_BAD_REQUEST)
            user.categories.set(valid_categories)

        user.save()
        return Response(
            {"message": "회원가입 완료", "redirect_url": f"/profile/{user.username}/"},
            status=status.HTTP_200_OK
        )

 

class CustomSocialAccountAdapter(DefaultSocialAccountAdapter):
    def save_user(self, request, sociallogin, form=None):
        user = super().save_user(request, sociallogin, form)
        provider = sociallogin.account.provider

        if not isinstance(user.connected_social_providers, list):
            user.connected_social_providers = []
        if provider not in user.connected_social_providers:
            user.connected_social_providers.append(provider)
        
        user.is_social_connected = True

 

 

해결

preferences에서 소셜 계정을 선택할 때 상태를 업데이트

class DashboardCompleteView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        user = request.user
        messenger_platform = request.data.get("messenger_platform")  # 선택된 소셜 계정
        category_ids = request.data.get("categories", [])  # 선택된 카테고리

        if messenger_platform:
            # 기본 소셜 제공자 설정
            user.default_social_provider = messenger_platform
            
            # 소셜 계정 연결 상태 업데이트
            if messenger_platform not in user.connected_social_providers:
                user.connected_social_providers.append(messenger_platform)
                user.is_social_connected = True

        if category_ids:
            valid_categories = Category.objects.filter(id__in=category_ids)
            if not valid_categories.exists():
                return Response({"error": "유효하지 않은 카테고리 ID입니다."}, status=status.HTTP_400_BAD_REQUEST)
            user.categories.set(valid_categories)

        user.save()
        return Response(
            {"message": "설정이 저장되었습니다.", "redirect_url": f"/profile/{user.username}/"},
            status=status.HTTP_200_OK
        )

 

회원가입 시 소셜 계정 상태를 자동으로 설정하도록 CustomSocialAccountAdapter를 수정

class CustomSocialAccountAdapter(DefaultSocialAccountAdapter):
    def save_user(self, request, sociallogin, form=None):
        user = super().save_user(request, sociallogin, form)
        provider = sociallogin.account.provider

        # 소셜 계정 상태 업데이트
        if provider not in user.connected_social_providers:
            user.connected_social_providers.append(provider)
            user.is_social_connected = True

        # 기본 소셜 제공자 설정
        if not user.default_social_provider:
            user.default_social_provider = provider

        user.save()
        return user

 

결과: 소셜로 회원가입한 사용자의 초기 상태가 다음과 같이 자동으로 설정

{
    "is_social_connected": true,
    "connected_social_providers": ["kakao"],
    "default_social_provider": "kakao"
}