백엔드 기준 카카오 소셜 로그인 기능 구현
💡 카카오 소셜 로그인 flow
1. 카카오가 프론트측으로 인가코드를 발급해준다.
2. 프론트측에서 인가코드를 통해 카카오에게 리프레시토큰, 엑세스토큰을 받는다.
3. 백엔드가 프론트에게 엑세스 토큰을 받는다.
4. 백엔드는 카카오측으로 엑세스 토큰을 통해 user의 정보를 받아온다.
내가 이해 한 전체적인 flow는 이렇다.
그중에서 백엔드가 해야할 부분은 3,4번
카카오 공식문서가 너~무 친절하다고 하는데 아니!! 이게 왜 친절한건데?? 하는 생각을 엄청 많이 했는데, 이해하고 나니 정말 너무너무 친절하다..!
우선 access_token이 있어야 테스트가 가능한데 프론트가 아직 작업중이라 토큰을 받아 볼 수가 없는데? 어떻게 테스트를 하지? 하는 생각이 들었는데, 카카오는 access_token을 준다!!!
도구-REST API 테스트
맨위 developer-sample에서 본인이 등록한 애플리케이션으로 들어가야 한다!!
나는 이부분을 몰라서 몇시간동안 헤맸다..
그리고 너무 당연한거지만, 내 어플리케이션에서 카카오 로그인을 켜두어야 한다.
⭐️ 카카오 소셜 로그인 전체적인 코드
class kakaoView(View):
def post(self, request):
try:
access_token = request.headers.get('Authorization', None)
url = 'https://kapi.kakao.com/v2/user/me'
headers = {'Authorization': f'Bearer {access_token}',
'Content-type': 'application/x-www-form-urlencoded;charset=utf-8'
}
response = requests.get(url,headers=headers)
data = response.json()
kakao_user_id = data['id']
email = data['kakao_account']['email']
nickname = data['kakao_account']['profile']['nickname']
if not User.objects.filter(kakao_user_id=kakao_user_id).exists():
User.objects.create(
kakao_user_id = kakao_user_id,
email = email,
nickname = nickname,
is_social = True
)
token = jwt.encode({'id': User.objects.get(kakao_user_id=kakao_user_id).id}, my_settings.SECRET['secret'], algorithm=my_settings.ALGORITHM)
return JsonResponse({'TOKEN': token, 'NICKNAME': nickname},status=200)
except KeyError:
return JsonResponse({'MESSAGE': 'KEY_ERROR'},status=401)