앞서 말한 것 처럼 이 코드는 프론트엔드 없이 백엔드에서 혼자 모든걸 다 처리하는 코드이다.
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)
카카오 API 명세의 인가 코드 받기 부분을 참조해보자.
postman 을 이용해 GET 요청을 통해 파라미터로 값을 넘겨주었다.
--> 성공적으로 인가코드를 받을 수 있었다.
카카오 API 명세의 토큰 받기 부분을 보자.
postman 을 이용해 POST 요청으로 파라미터로 값을 넘겨주었다.
--> 성공적으로 access_token 을 받을 수 있었다.
나중에 자세히 공부 할 예정이다.