[Django] 카카오 로그인 API 구현해보기 🎨

Inah-_-·2021년 4월 7일
1

Django

목록 보기
6/8
post-thumbnail

전체적인 Flow

Front

KakaoDevelopers에 가서 APP 등록
사용자 동의 항목 체크 (Backend와 상의 후 어떤 정보를 저장할 것인지 선택)
토큰을 받을 수 있는 코드를 받아오기

Back

Front에게 받은 사용자 토큰(Access Token)으로 해당 토큰의 사용자 정보 호출

Kakao 공식 가이드를 보면 Bearer {access_token} header를 담은 요청을 보내라고 되어있는데, 어렵게 생각할 거 하나 없이 그냥 가이드대로 해주면 된다.
근데 나는 이게 무척 어려웠다. 그냥 가이드만 보고 무엇을 요청하거나 개발하는 것이
처음이였기 때문..

 access_token = request.headers["Authorization"]
 headers      = ({'Authorization':f'Bearer {access_token}'})
 kakao_url    = 'https://kapi.kakao.com/v2/user/me'
 response     = requests.get(kakao_url, headers = headers)

이 이후에 또 사용자 정보 가져오는 데서 많이 헤맸는데,
처음에 값을 받아왔을 때 json 뭉탱이?로 와서 어떤게 누구의 Value인지 찾기 힘들었다.
그래서 json으로 온 뭉탱 아이들을 하나하나 해체했음.

Before

{
'id': 1004,'connected_at': '2021-04-01T08:25:00Z', 'properties': {'nickname': 'inah','profile_image':'http://k.kakaocdn.net/img_640x640.jpg','thumbnail_image':'http://k.kakaocdn.net/img_110x110.jpg'},
'kakao_account':{'profile_needs_agreement': False,'profile': 
{'nickname': 'inah','thumbnail_image_url': 'http://k.kakaocdn.net/img_110x110.jpg','profile_image_url':'http://k.kakaocdn.net/img_640x640.jpg'},
'has_email': True, 'email_needs_agreement': True,'has_gender': True, 'gender_needs_agreement': True}} 

해체쇼After

{
'id'	      : 1004,
'connected_at': '2021-04-01T08:25:00Z',
'properties': {
	'nickname'       : 'inah',
	'profile_image'  :'http://k.kakaocdn.net/img_640x640.jpg',
        'thumbnail_image': 'http://k.kakaocdn.net/img_110x110.jpg'}, 
	'kakao_account'  : {
		'profile_needs_agreement': False,
		'profile'		 : {
			'nickname': 'inah',
			'thumbnail_image_url': 'http://k.kakaocdn.net/img_110x110.jpg', 				'profile_image_url': 'http://k.kakaocdn.net/img_640x640.jpg'
			}, 
		'has_email': True,
        	'email_needs_agreement': True, 			
        	'has_gender': True,
        	'gender_needs_agreement': True
		}
} 

근데 친절히 공식문서에 나와있었음 ㅋㅋㅋㅋ 공식 문서 보는 것을 습관화 합시다.
카카오짱이시다.
이 글을 보는 여러분들은 이 key 값을 사용하십시오

예를 들어 user의 nickname과 email을 가져오고 싶다면,

user = response.json()

kakao_name  = user['properties']['nickname']
kakao_email = user['kakao_account']['email']

이렇게 써주면 된당

이제 가져온 값을 조회하여 로그인 시키거나, 정보가 DB에 없다면 회원가입 시켜주면 끝

kakao_user, is_created = User.objects.get_or_create(kakao_id = user['id'])
if not is_created:
    kakao_id           = kakao_id,
    name               = kakao_name,
    profile_image_url  = kakao_profile_img
    kakao_user.save()

return JsonResponse({
    'message'         : 'SUCCESS',
    'access_token'    : access_token
    }, status=201)

코드 리뷰를 받은 후 get_or_create를 처음 사용해봤는데
코드가 12줄 줄어들고 간결 of 간결 + 가독성 갑
넘나 마음에 든당 많이 많이 써머거야징

공식 문서만 보고 처음 개발했던 터라 처음엔 너무 막막했지만
지금 생각해보면 그렇게 뿌듯할 수가 없다🥺

역시 뭐든 처음이 어려운 법..

처음이 정말 어려웠던 UnitTest 블로깅은 다음에..🤞



Reference

profile
Backend Developer

1개의 댓글

comment-user-thumbnail
2021년 5월 11일

덕분에 카카오 로그인 인증 했습니다 감사합니다.

답글 달기