푸딩캠프 토이 프로젝트에서 django로 회원 인증 서버를 개발하는 중인데 며칠 내내 rest-auth와 all-auth 갖고 씨름중 🫨
처음엔 url 접속하면 다 해주니까? 편했는데 결국 내가 원하는 구글 소셜 로그인, 이메일 통한 회원가입 및 메일 인증 구현을 하기 위해서는..
커스텀이 답인듯🤣
기본 회원가입 로직은 username을 입력 받지만, username은 spring 서버에서 생성할 것이기 때문에 나(django)는 단순히 이메일과 비밀번호만으로 회원가입을 시켜야 된다.
그래서, User 모델에서 username 컬럼도 없앤 상황.

그러나 rest-auth에서 회원가입 할 때는 여전히 username을 받아서 처리하고 있었다.
결국 serializer 커스텀 하는 방안을 택했다.

RegisterSerializer 구석 구석에서 allauth의 흔적?을 찾을 수 있었는데,
Allauth가 기본적으로 username 필드를 요구하고,
get_adapter()로 AccountAdapter 객체를 가져와서 로직들을 처리하고 있었다.
from allauth.account.adapter import get_adapter
from dj_rest_auth.registration.serializers import RegisterSerializer
class CustomRegisterSerializer(RegisterSerializer):
username = None
def get_cleaned_data(self):
return {
"email": self.validated_data.get("email", ""),
"password1": self.validated_data.get("password1", ""),
}
def save(self, request):
adapter = get_adapter()
user = adapter.new_user(request)
self.cleaned_data = self.get_cleaned_data()
user = adapter.save_user(request, user, self, commit=False)
if "password1" in self.cleaned_data:
try:
adapter.clean_password(self.cleaned_data["password1"], user=user)
except DjangoValidationError as exc:
raise serializers.ValidationError(
detail=serializers.as_serializer_error(exc)
)
user.save()
self.custom_signup(request, user)
setup_user_email(request, user, [])
return user
그래서 나는 username 필드를 없애고, get_cleaned_data()로 입력 받은 이메일과 비밀번호만으로 회원가입을 진행시켰다.
(나중엔 serializers.ValidationError 마저도 프론트엔드로 하여금 응답을 처리하는 데에 불편함을 초래해서
이 또한 drf exceptions ValidationError로 변경하였다)

의도하던 대로 이메일과 비밀번호만으로 회원가입을 진행할 수 있게 되었다 🎵
결론적으로 이번에 auth 로직을 구현하면서
라이브러리 기능만으로는 해결되지 않는 요구 사항이 있을 때,
그 내부 로직을 정확히 파악하고 필요한 부분을 수정하는 것이 중요하다는 것을 뼈저리게 느끼게 되었다..
이번에 깨달았으니 다음엔 더 작업 시간을 단축할 수 있기를!