Python & Django

[Django] Django Kakao Login API

응디 2021. 8. 25. 17:54

- 카카오 로그인 진행 과정

 

 

  1. 카카오 개발자 애플리케이션 등록 + 카카오 로그인 활성화
    • 아래 링크에서 내 애플리케이션을 하나 생성하면 앱 키를 생성 받을 수 있음
    • 앱 키 생성 확인 후 카카오 로그인 활성화 + Redirect URI를 추가해 줘야함

링크 : https://developers.kakao.com/

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

 

앱 키 생성 예시

 

카카오 로그인 활성화 예시

 


  • Code
class KakaoSignInView(View):
    """
    인증 코드 받아오기
    """
    def get(self, request):
        current_site = get_current_site(request)
        client_id = KAKAO_KEY
        redirect_uri = "http://" + current_site.domain + "/account/sign-in/kakao/callback/"
        return redirect(
            f"https://kauth.kakao.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code"
        )


class KakaoSignInCallbackView(View):
    def get(self, request):
        try:
						# 현재 도메인 주소
            current_site = get_current_site(request)

            code = request.GET.get("code")
            kakao_token_api = 'https://kauth.kakao.com/oauth/token'
            redirect_uri = "http://" + current_site.domain + "/account/sign-in/kakao/callback/"

            data = {
                'grant_type': 'authorization_code',
                'client_id': KAKAO_KEY,
                'redirect_uri': redirect_uri,
                'code': code
            }
						
			# token request 및 response
            token_response = requests.post(kakao_token_api, data=data)

            error = token_response.json().get('error', None)
            if error is not None:
                raise Exception

            access_token = token_response.json().get('access_token')

            profile_response = requests.get('https://kapi.kakao.com/v2/user/me', headers={"Authorization": f'Bearer ${access_token}'})

            email = profile_response.json().get("kakao_account", None).get('email')
            name = profile_response.json().get("properties").get("nickname")
            email_exist = True
            if email is None:
                email_exist = False
                raise Exception

            try:
                user= Account.objects.get(email=email, type='kakao')
                if user.type != 'kakao':
                    raise Exception
            except Account.DoesNotExist:
            	# 회원이 존재 하지 않으면 DB 삽입
                user = Account.objects.create(
                    email=email,
                    name=name,
                    type='kakao',
                    is_active=email_exist,
                )
                user.save()

            request.session['token'] = access_token

            return redirect("main:index")

        except Exception:
            return redirect('account:login')

 

'Python & Django' 카테고리의 다른 글

[Python] 권장사항  (0) 2021.09.02
[Python] pool_recycle + wait_timeout  (0) 2021.09.01
[Django] Django url tag( parameter )  (0) 2021.08.25
[Django] Django 비밀번호 암호화(Argon2 이용)  (0) 2021.08.25
[Django] Django Setting  (0) 2021.08.25