2차 프로젝트를 하면서 카카오 소셜 로그인을 적용하기로 하였다.
자세한 내용은 카카오 공식 문서를 참고하길 바란다.
우선 기본적인 Flow를 설명하도록 하겠다.
우선 공식 사이트를 통해 사이트 혹은 앱을 등록한 후 고유 키를 받은 후에 프론트 측에서 인증 코드를 통해 카카오 api를 호출하고 로그인 한 후 토큰을 받아오고 해당 토큰을 백엔드 측에 전달하면 백엔드에서 해당하는 사용자의 정보를 카카오 서버에 요청하여 로그인, 혹은 회원가입과 함께 로그인을 진행한다.
이 때 사용자 정보는 동의해야만 전달되는 것이 있기 때문에 동의 항목 설정도 필요하다.
여기서 보여지는 코드는 프론트 측으로부터 전달받은 토큰을 통해 카카오 서버에 사용자 정보를 요청하고 해당 정보로 가입한 내역이 있는 회원이면 로그인을 시켜 내 서버에 있는 정보를 통해 토큰을 생성하여 프론트에 전달한다.
만약 회원가입 내역이 없다면 카카오로부터 전달받은 정보로 회원가입 진행 후 토큰을 전달한다.
class KakaoSignIn(View):
def post(self, request):
try:
token = request.headers.get('Authorization')
profile_json = requests.get(
'https://kapi.kakao.com/v2/user/me',
headers={'Authorization':f'Bearer {token}'}
).json()
email = profile_json.get('kakao_account')['email']
nickname = profile_json.get('properties')['nickname']
if User.objects.filter(email = email).exists():
user = User.objects.get(email = email)
else:
platform, _ = Platform.objects.get_or_create(
name = 'kakao'
)
user = User.objects.create(
first_name = nickname,
last_name = None,
email = email,
password = None,
platform = platform
)
access_token = jwt.encode({'id':user.id}, my_settings.SECRET_KEY, algorithm = my_settings.ALGORITHM)
return JsonResponse({'access_token':access_token.decode()}, status = 200)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status = 400)