프로젝트
소셜계정 선택 로직 업데이트
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"
}