출처 : kakao developers doc
5-1) 백 엔드에서 redierct uri를 받을 url설정하기
- 처리를 원하는 url을 설정해 줍니다.
# urls.py
from django.urls import path
from user.views import kakao_social_login, kakao_social_login_callback
urlpatterns = [
#로그인 요청을 보낼 url
path('account/login/kakao/', kakao_social_login, name='kakao_login'),
#받은 인가 코드로 접근 토근을 받아 유저의 정보를 가져올 url
path('account/login/kakao/callback/', kakao_social_login_callback, name='kakao_login_callback'),
]
# views.py
def kakao_social_login(request):
pass
def kakao_social_login_callback(request):
pass
5-2) 프론트 엔드에서 버튼을 만들기!
<!-- 로그인 버튼과 백엔드에서 설정해준 URL로 설정하기 -->
<a id="kakao-login-btn" href="/account/login/kakao">
<img src="https://k.kakaocdn.net/14/dn/btroDszwNrM/I6efHub1SN5KCJqLm1Ovx1/o.jpg" width="222" alt="카카오 로그인 버튼"/>
</a>
5-3) 카카오 developers에서 로그인 활성화 & redirect uri 등록하기
저희가 처리해야할 부분은 4개가 되겠습니다.
def kakao_social_login(request):
"""
카카오톧에 나의 애플리케이션의 정보를 담아 사용자에게 카카오 로그인 요청
"""
if request.method == 'GET':
client_id = CLIENT_ID # 앱키 ex) b923j1i23k4io1l2k3ji1uaq2
redirect_uri = 'http://127.0.0.1:8000/account/login/kakao/callback' # 인가 코드를 받을 uri
return redirect(
f'https://kauth.kakao.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code'
)
pip install requests
def kakao_social_login_callback(request):
"""
받은 인가 코드, 애플리케이션 정보를 담아 /oath/token/에 post요청하여 접근코드를 받아 처리하는 함수
"""
try:
code = request.GET.get('code')
# client_id = CLIENT_ID
# redirect_uri = 'http://127.0.0.1:8000/account/login/kakao/callback' # 인가 코드를 받은 URI
# token_request = requests.post(
# 'https://kauth.kakao.com/oauth/token', {'grant_type': 'authorization_code',
# 'client_id': client_id, 'redierect_uri': redirect_uri, 'code': code}
# )
# token_json = token_request.json()
# error = token_json.get('error', None)
# if error is not None:
# print(error)
# return JsonResponse({"message": "INVALID_CODE"}, status=400)
# access_token = token_json.get("access_token")
# except KeyError:
# return JsonResponse({"message": "INVALID_TOKEN"}, status=400)
# except access_token.DoesNotExist:
# return JsonResponse({"message": "INVALID_TOKEN"}, status=400)
# #------get kakaotalk profile info------#
# profile_request = requests.get(
# "https://kapi.kakao.com/v2/user/me", headers={"Authorization": f"Bearer {access_token}"},
# )
# profile_json = profile_request.json()
# kakao_id = profile_json.get('id')
# username = profile_json['properties']['nickname']
def kakao_social_login_callback(request):
"""
받은 인가 코드, 애플리케이션 정보를 담아 /oath/token/에 post요청하여 접근코드를 받아 처리하는 함수
"""
try:
code = request.GET.get('code')
client_id = CLIENT_ID # 앱 키
redirect_uri = 'http://127.0.0.1:8000/account/login/kakao/callback' # 인가 코드를 받은 URI, 이 부분은 크게 상관이 없어보입니다.
token_request = requests.post(
# grant_type은 authorization_code로 고정입니다.
'https://kauth.kakao.com/oauth/token', {'grant_type': 'authorization_code',
'client_id': client_id, 'redierect_uri': redirect_uri, 'code': code}
)
token_json = token_request.json()
# error = token_json.get('error', None)
# if error is not None:
# print(error)
# return JsonResponse({"message": "INVALID_CODE"}, status=400)
# access_token = token_json.get("access_token")
# except KeyError:
# return JsonResponse({"message": "INVALID_TOKEN"}, status=400)
# except access_token.DoesNotExist:
# return JsonResponse({"message": "INVALID_TOKEN"}, status=400)
# #------get kakaotalk profile info------#
# profile_request = requests.get(
# "https://kapi.kakao.com/v2/user/me", headers={"Authorization": f"Bearer {access_token}"},
# )
# profile_json = profile_request.json()
# kakao_id = profile_json.get('id')
# username = profile_json['properties']['nickname']
def kakao_social_login_callback(request):
"""
받은 인가 코드, 애플리케이션 정보를 담아 /oath/token/에 post요청하여 접근코드를 받아 처리하는 함수
"""
try:
code = request.GET.get('code')
client_id = CLIENT_ID # 앱 키
redirect_uri = 'http://127.0.0.1:8000/account/login/kakao/callback' # 인가 코드를 받은 URI
token_request = requests.post(
'https://kauth.kakao.com/oauth/token', {'grant_type': 'authorization_code',
'client_id': client_id, 'redierect_uri': redirect_uri, 'code': code}
)
token_json = token_request.json()
#------------유효성 검증 --------------#
error = token_json.get('error', None)
if error is not None:
print(error)
return JsonResponse({"message": "INVALID_CODE"}, status=400)
#-------------받은 토큰---------------#
access_token = token_json.get("access_token")
except KeyError:
return JsonResponse({"message": "INVALID_TOKEN"}, status=400)
except access_token.DoesNotExist:
return JsonResponse({"message": "INVALID_TOKEN"}, status=400)
#------토큰을 이용하여 사용자 정보 조회------#
profile_request = requests.get(
"https://kapi.kakao.com/v2/user/me", headers={"Authorization": f"Bearer {access_token}"},
)
#------사용자 정보를 활용---------------#
profile_json = profile_request.json()
print(profile_json)
kakao_id = profile_json.get('id')
username = profile_json['properties']['nickname']