이전에 포스팅했던 글에서 JS로 정규표현식 유효성 검증을 거친 후 서버에 사용자가 입력한 값으로 회원가입을 요청하는 기능을 구현했었다.
회원가입은 백엔드/프론트에서 테스트 했을 때 정상적으로 진행이 되었지만 가입한 계정으로 로그인을 했을 때 401 unauthorized 에러가 발생했다.
401은 사용자를 찾을 수 없어서 발생한 에러인데 회원가입 후 DB에 확인해보면 가입한 유저가 생성이 되어있음에도 불구하고 로그인이 되지 않는 것이 이해할 수 없었다.
views.py
class SignupView(APIView):
def post(self, request):
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({"message":"가입완료!"}, status=status.HTTP_201_CREATED)
else:
return Response({"message":f"${serializer.errors}"}, status=status.HTTP_400_BAD_REQUEST)
우선 프론트에서 fetch로 회원가입 API에 요청을 보내면 SignupView가 실행되어 클라이언트가 보낸 데이터를 검증하고 저장하거나 데이터가 없다면 에러가 뜬다.
하지만 나의 경우에는 DB에 유저가 생성이 되었기 때문에 SignupView에서 문제가 발생한 것은 아니다.
그래서 Serializer를 확인해보았다.
Serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "__all__"
def create(self, validated_data):
user = super().create(validated_data)
password = user.password
user.set_password(password)
user.save()
return user
def update(self, instance, validated_data):
user = super().update(instance, validated_data)
password = user.password
user.set_password(password)
user.save()
return user
SignupView는 UserSerializer를 사용하고, User 모델을 기반으로 한다.
메소드는 생성 기능을 하는 create가 있고, 수정 기능을 하는 update가 있다.
우선 가입 후 로그인 단계에서 문제가 발생했으니 update는 제외하고 create를 살펴보았더니 SignupView에서 검증한 validated_data로 user를 생성하고 user의 패스워드 생성 및 해싱 후 저장한다.
여기서도 문제를 찾기 어려웠고 엄청난 시간을 소모했는데 구글링을 하다가 create 메소드에서 user를 save 하기 전 user.is_active = True로 가입한 유저의 상태를 활성화를 시킨 후 save를 해야 생성된 유저로 로그인을 진행할 수 있었다.
혹은 User 모델에서 is_active 필드를 추가하면 serializer에서 추가하지 않아도 된다.
그럼 update도 is_active를 해야하는 건지 찾아보니 is_active는 생성 시 True 삭제 시 False로만 사용해주면 되고, update 경우에는 이미 생성 시에 True가 적용되었기 때문에 별도로 설정해주지 않아도 된다.
그래서 create 메소드에 user.is_active = True를 설정하고 로그인을 해보았더니 정상적으로 로컬 스토리지에 등록이 되고 로그인을 할 수 있었다.