TIL DAY 32-2 || Kakao Login API with Django

TK·2021년 4월 4일
0

TIL

목록 보기
39/55

Python Django Kakao API Login

Only Backend side Without Frontend

앞서 말한 것 처럼 이 코드는 프론트엔드 없이 백엔드에서 혼자 모든걸 다 처리하는 코드이다.

import jwt
import requests

from django.shortcuts import redirect
from django.views     import View
from django.http      import JsonResponse

from .models import User

from my_settings import SECRET_KEY, HASHING_ALGORITHM, KAKAO_RESTAPI_KEY


KAKAO_REDIRECT_URL         = 'http://localhost:8000/user/login/kakao/oauth'
KAKAO_TOKEN_REQUEST_URL    = 'https://kauth.kakao.com/oauth/token'
KAKAO_USERINFO_REQUEST_URL = 'https://kapi.kakao.com/v2/user/me'


class KakaoLoginView(View):
    def get(self, request):
        client_id    = KAKAO_RESTAPI_KEY
        redirect_url = KAKAO_REDIRECT_URL

        return redirect('https://kauth.kakao.com/oauth/authorize?client_id={}&redirect_uri={}&response_type=code'.format(client_id, redirect_url))


class KakaoLoginCallbackView(View):
    def get(self, request):
        try:
            code = request.GET.get('code')

            data = {
                    'grant_type'  : 'authorization_code',
                    'client_id'   : KAKAO_RESTAPI_KEY,
                    'redirect_uri': KAKAO_REDIRECT_URL,
                    'code'        : code
                }

            token_response = requests.post(KAKAO_TOKEN_REQUEST_URL, data=data).json()

            access_token  = token_response.get('access_token')
            refresh_token = token_response.get('refresh_token')
            error         = token_response.get('error')

            if error:
                return JsonResponse({'message': 'INVAILD_REQUEST, {}'.format(error)}, status=400)

            headers = {'Authorization': 'Bearer {}'.format(access_token)}

            response = requests.get(KAKAO_USERINFO_REQUEST_URL, headers=headers).json()

            kakao_user_id       = response.get('id')

            if kakao_user_id:
                user, _   = User.objects.get_or_create(kakao_id=kakao_user_id)
                jwt_token = jwt.encode({'user_id': user.id}, SECRET_KEY, algorithm=HASHING_ALGORITHM)
    
                return JsonResponse({'token' : jwt_token}, status=200)
            else:
                return JsonResponse({'message': 'INVALID_ACCESS_TOKEN'}, status=400)

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

1. How to get Authorization Code (인가코드)

  • RESTAPI KEY 로 인가코드부터 받아야 한다.

카카오 API 명세의 인가 코드 받기 부분을 참조해보자.

postman 을 이용해 GET 요청을 통해 파라미터로 값을 넘겨주었다.

--> 성공적으로 인가코드를 받을 수 있었다.

2. How to get access_token

  • 받은 인가코드로 access_token 을 받아야 한다.

카카오 API 명세의 토큰 받기 부분을 보자.

postman 을 이용해 POST 요청으로 파라미터로 값을 넘겨주었다.

--> 성공적으로 access_token 을 받을 수 있었다.

3. How to get user information

  • 받은 access_token 으로 카카오톡에 가입 된 유저 정보를 받아올 수 있다.

CSRF 방어

나중에 자세히 공부 할 예정이다.

profile
Backend Developer

0개의 댓글