저번에 했던 소셜 로그인으로 해당 인증기관의 토큰을 받아와 저장했는데, 이번에는 simpleJWT 를 통해 토큰을 받아와 payload 로 저장해보려고 한다.
처음 simpleJWT 를 받아올 때 프론트에서 fetch 문으로 하려고 했으나, 계속 인증 에러가 나면서 실패했다. 그래서 계속 찾아보던 중, from rest_framework_simplejwt.tokens import RefreshToken
을 알게되었다. 장고 simpleJWT 에서 제공하는 패키지인데, for_user() 을 통해 토큰을 받을 수 있는 함수라고 한다. 해서 우선 해당 함수를 적용시켜 보았다.
user = User.objects.get(email=user_email)
social_user = SocialAccount.objects.filter(
uid=user_email).first()
# 동일한 이메일의 유저가 있지만, 소셜 계정이 아닐 때
if social_user is None:
return Response({"error": "소셜 계정이 아닌 이미 존재하는 이메일입니다."}, status=status.HTTP_400_BAD_REQUEST)
# 소셜 계정이 카카오가 아닌 다른 소셜 계정으로 가입했을 때
if social_user.provider != "kakao":
print("not kakao")
return Response({"error": "다른 소셜 계정으로 가입되어 있습니다."}, status=status.HTTP_400_BAD_REQUEST)
# 소셜 로그인 사용자의 경우
if social_user:
# 사용자의 비밀번호 없이 로그인 가능한 JWT 토큰 생성
refresh = RefreshToken.for_user(user)
return Response({'refresh': str(refresh), 'access': str(refresh.access_token), "msg": "로그인 성공"}, status=status.HTTP_200_OK)
이 부분을 추가했다.
그 결과 카카오는 제대로 simpleJWT 를 받아오는 것을 확인할 수 있었다. 우선 social_user 에서 유저가 있는지 찾고 이메일이 있되 소셜 계정에 없으면 자체 회원가입을 진행한 유저이니 에러, 깃허브로 회원가입한 유저는 카카오가 아니므로 에러, 이외의 에러가 없고 소셜 계정에 있다면 카카오로 로그인한 유저가 맞으니 RefreshToken.for_user() 을 통해 토큰을 발급받아 프론트에 준다.
깃허브 또한 로직은 똑같다. 다만 인가코드에 scope 를 추가하고 받아오는 토큰에 refresh_token 이 없을 뿐이다. provider 부분을 전부 github 로 바꿔주면 된다.