[Django] 카카오 소셜 로그인 (REST API)

Jayson Hwang·2022년 6월 12일
0

REST API를 사용한 카카오 로그인 구현

카카오 개발자 문서 링크 : KAKAO DEVELOPERS LINK

카카오 로그인 시퀀스 다이어그램

시작 전...

  • 내 애플리케이션 생성
    • REST API 키 확인
    • 플랫폼 탭에서 사이트 도메인(ex. http://localhost:8000) 적용
    • Redirect URI 설정(카카오 로그인에서 사용할 OAuth Redirect URI 설정)
    • ex) http://localhost:8000/user/kakao/callback
    • "동의 항목"에서 개인정보 관련 필수 or 선택 동의(권한) 설정

STEP 1.. 인가 코드 받기

카카오 로그인을 시작하는 단계로,

  1. 카카오 로그인 동의 화면을 호출
  2. 사용자 동의를 거쳐 인가 코드 발급 요청
  3. 인가코드는 토큰 받기에 필요한 값, 토큰에 부여될 권한 정보를 포함

사용자가 필수 동의항목에 모두 동의하면,

  1. 카카오 인증 서버는 해당 사용자에게 대한 인가 코드를 발급
  2. 서비스의 redirect_uri에 전달
  3. 인가 코드 요청의 응답은 redirect_uriHTTP 302 Redirect
  4. Location에 인가 코드가 담긴 쿼리 스트링을 포함

관련 코드 ::

import jwt
import requests

from django.shortcuts import redirect

class KakaoSignInView(View):
    def get(self, request):
        client_id     = settings.KAKAO_CLIENT_ID
        kakao_auth_id = "https://kauth.kakao.com/oauth/authorize?response_type=code"
        redirect_uri  = "http://localhost:8000/user/kakao/callback"

        return redirect(
            f"{kakao_auth_id}&client_id={client_id}&redirect_uri={redirect_uri}"
            )

STEP 2.. 토큰 받기

인가코드로 토큰 발급 요청

  1. 인가 코드 받기만으로 카카오 로그인이 완료되지는 않음
  2. 토큰 받기까지 마쳐야 카카오 로그인을 정상적으로 완료 가능

관련 코드 ::

class KakaoCallBackView(View):
    def get(self, request):
        kakao_token_api = "https://kauth.kakao.com/oauth/token"
        data = {
            "grant_type"  : "authorization_code",
            "client_id"   : settings.KAKAO_CLIENT_ID,
            "redirect_uri": "http://localhost:8000/user/kakao/callback",
            "code"        : request.GET.get("code")
        }

        access_token = requests.post(kakao_token_api, data=data).json().get('access_token')
        # access_token = requests.post(kakao_token_api, data=data).json()['access_token']
        # return JsonResponse({"token" : access_token})

RESPONSE 성공 시,

STEP 3.. 사용자 정보 가져오기

발급받은 토큰을 이용해서,

  1. GET 요청

관련 코드 ::

user_info = requests.get('https://kapi.kakao.com/v2/user/me', headers={"Authorization": f"Bearer {access_token}"}).json()
# return JsonResponse({"user_info" : user_info})

RESPONSE 성공 시,

아래와 같은 결과 값이 출력된다.

STEP 4.. 사용자 정보 가공하여 DB로 저장

전달받은 사용자 정보를 이용해서,

  1. 내가 원하는 형태로 저장할 수 있도록 변수를 설정
  2. DB에 정보가 없다면 저장, 정보가 이미 존재하면 바로 로그인(토큰발급)

관련 코드 ::

kakao_id = user_info["id"]
kakao_name = user_info["properties"]["nickname"]
kakao_email = user_info["kakao_account"]["email"]
profile_image_url = user_info["properties"]["profile_image"]

if User.objects.filter(social_account_id = kakao_id).exists():
    user = User.objects.get(social_account_id = kakao_id)
    access_token = jwt.encode({"id" : user.id}, settings.SECRET_KEY, algorithm = settings.ALGORITHM
    return JsonResponse({"message" : "SIGN IN SUCCESS", "token" : access_token}, status=200)

User(
    social_account_id = kakao_id,
    name = kakao_name,
    email = kakao_email,
    profile_image = profile_image_url,
    social_id = Social.objects.get(name="kakao").id,
    terms_agreements = {1:2},
).save()

user = User.objects.get(social_account_id=kakao_id)
access_token = jwt.encode({"id" : user.id}, settings.SECRET_KEY, algorithm = settings.ALGORITHM)

return JsonResponse({"message" : "ACCOUNT CREATED", "token" : access_token}, status=200)
profile
"Your goals, Minus your doubts, Equal your reality"

0개의 댓글