카카오 소셜 로그인

정현석·2020년 12월 25일
0

redirect를 활용하여 소셜 로그인을 구현.

class KakaoSignInView(View):
    def get(self, request):
        client_id    = KAKAO_REST_API
        redirect_uri = "http://127.0.0.1:8000/user/kakao"

        return redirect(
            f"https://kauth.kakao.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code"
        )
                	# redirect는 사용자가 카카오 소셜 로그인으로 로그인 할 때 동의해야하는 부분을 동의하였을 때 소셜 로그인 페이지로 접속할 수 있도록 구현함.
                    
class KakaoSignInCallbackView(View):
    def get(self, request):
        try:
            code         = request.GET.get('code')
            client_id    = KAKAO_REST_API
            redirect_uri = "http://127.0.0.1:8000/user/kakao"

            token_request = requests.get(f"https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id={client_id}&redirect_uri={redirect_uri}&code={code}")
            		# 토큰을 발행하기 위해 redirect 로 넘어온 페이지에서 code를 get하여 카카오 서버에 다시 보내어 토큰을 가져온다.
            token_json    = token_request.json()
            error         = token_json.get('error', None)

            if error is not None :
                return JsonResponse({'message':'INVALID_CODE'}, status=400)

            token = token_json.get('access_token')
            
         		 #  ---- profile 정보 불러오기----

            profile_request = requests.get(
                "https://kapi.kakao.com/v2/user/me", headers= {"Authorization" : f"Bearer{token}"},)
            profile_json = profile_request.json()


            email         = profile_json.get("email", None)
            kakao_id      = profile_json.get("id")
            		# 불러오는 정보의 구조를 확인한 뒤 가져와야한다!! 

            if User.objects.filter(kakao_id = kakao_id).exists():
                user  = User.objects.filter(kakao_id=kakao_id)
                token = jwt.encode({"email":email}, SECRET, algorithm=JWT_ALGORITHM).decode("utf-8")
                return JsonResponse({"token":token}, status=200)

            User.objects.create(
                kakao_id = kakao_id,
                email    = email
            )
            token = jwt.encode({"email":email}, SECRET, algorithm=JWT_ALGORITHM).decode("utf-8")

            return JsonResponse({"token":token}, status=200)

        except  KeyError:
            return JsonResponse({'message':'KEY_ERROR'}, status=400)

참고 사이트

profile
기록하는 벨로그

0개의 댓글