Skip to content

Instantly share code, notes, and snippets.

@JunsikChoi
Created May 28, 2021 08:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JunsikChoi/04d5314546b6a3e2bad6c1f74baf3dde to your computer and use it in GitHub Desktop.
Save JunsikChoi/04d5314546b6a3e2bad6c1f74baf3dde to your computer and use it in GitHub Desktop.
Kakao Social Login with Django
class KakaoAuth:
REST_API_KEY = KAKAO_REST_API_KEY
REDIRECTION_URI = API_HOST_ADDRESS + "/users/signin/kakao/callback"
OAUTH_API_ENDPOINT = "https://kauth.kakao.com/oauth"
AUTH_API_ENDPOINT = OAUTH_API_ENDPOINT + "/authorize"
TOKEN_API_ENDPOINT = OAUTH_API_ENDPOINT + "/token"
@classmethod
def get_auth_redirection_url(cls):
return f'{cls.AUTH_API_ENDPOINT}?response_type=code&client_id={cls.REST_API_KEY}&redirect_uri={cls.REDIRECTION_URI}'
@classmethod
def get_token_response(cls, auth_code):
payload = {
'grant_type': 'authorization_code',
'client_id': KAKAO_REST_API_KEY,
'redirection_uri': cls.REDIRECTION_URI,
'code': auth_code,
}
return requests.post(cls.TOKEN_API_ENDPOINT, payload)
class KakaoSignInView(View):
def get(self, request):
return redirect(KakaoAuth.get_auth_redirection_url())
class KakaoSignInCallBackView(View):
def get(self, request):
try:
auth_code = request.GET.get('code')
error = request.GET.get('error')
if error:
error_description = request.GET.get('error')
return JsonResponse({"status": "UNAUTHORIZATION_ERROR", "message": error_description}, status=401)
token_response = KakaoAuth.get_token_response(auth_code)
access_token = token_response.json().get('access_token')
user_info_response = requests.get('https://kapi.kakao.com/v2/user/me', headers={"Authorization": f'Bearer ${access_token}'})
user_info = user_info_response.json()
kakao_id = user_info['id']
username = user_info['properties']['nickname']
profile_image_url = user_info['properties']['profile_image']
email = user_info['kakao_account'].get('email')
if (User.objects.filter(kakao_id = kakao_id).exists()):
user = User.objects.get(kakao_id = kakao_id)
else:
user = User.objects.create(
username = username,
email = email,
profile_image_url = profile_image_url,
kakao_id = kakao_id,
)
token = issue_token(user)
return JsonResponse({"status": "SUCCESS", "data": {"token": token}}, status=200)
except KeyError as e:
return JsonResponse({"status": "KEY_ERROR", "message": f'Key Error in Field "{e.args[0]}"'}, status=400)
except requests.exceptions.Timeout as e:
return JsonResponse({"status": "TIMEOUT_ERROR", "message": e.response.message}, status=e.response.status_code)
except requests.exceptions.ConnectionError as e:
return JsonResponse({"status": "CONNECTION_ERROR", "message": e.response.message}, status=e.response.status_code)
except requests.exceptions.HTTPError as e:
return JsonResponse({"status": "TIMEOUT_ERROR", "message": e.response.message}, status=e.response.status_code)
except DuplicatedEntryError as e:
return JsonResponse({"status": "DUPLICATED_ENTRY_ERROR", "message": e.err_message}, status=409)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment