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)