카카오 소셜 로그인 기능 구현

신지원·2021년 5월 9일
1

백엔드 기준 카카오 소셜 로그인 기능 구현

💡 카카오 소셜 로그인 flow
1. 카카오가 프론트측으로 인가코드를 발급해준다.
2. 프론트측에서 인가코드를 통해 카카오에게 리프레시토큰, 엑세스토큰을 받는다.
3. 백엔드가 프론트에게 엑세스 토큰을 받는다.
4. 백엔드는 카카오측으로 엑세스 토큰을 통해 user의 정보를 받아온다.

내가 이해 한 전체적인 flow는 이렇다.
그중에서 백엔드가 해야할 부분은 3,4번

  • user의 정보 요청을 성공하면, 응답 바디는 Json 객체로 사용자 정보들을 포함합니다.
    이 부분이 중요하다!!
    카카오가 토큰을 통해 사용자의 정보를 우리에게 전달해주면 그 정보가 json 형태로 되어있기 때문에 우리는 그 정보중에 원하는 것만 잘 사용하면 된다!


카카오 공식문서가 너~무 친절하다고 하는데 아니!! 이게 왜 친절한건데?? 하는 생각을 엄청 많이 했는데, 이해하고 나니 정말 너무너무 친절하다..!

  1. 우선, GET/POST 부분은 method로 get,post 둘다 사용할 수 있다는 뜻
  2. /v/user/me 부분은 두번째 줄에 있는 Host 뒷 부분에 붙는 url
  3. Authorization, Content-type 부분은 headers에 담아야 하는 부분

우선 access_token이 있어야 테스트가 가능한데 프론트가 아직 작업중이라 토큰을 받아 볼 수가 없는데? 어떻게 테스트를 하지? 하는 생각이 들었는데, 카카오는 access_token을 준다!!!


도구-REST API 테스트

맨위 developer-sample에서 본인이 등록한 애플리케이션으로 들어가야 한다!!
나는 이부분을 몰라서 몇시간동안 헤맸다..

그리고 너무 당연한거지만, 내 어플리케이션에서 카카오 로그인을 켜두어야 한다.



⭐️ 카카오 소셜 로그인 전체적인 코드

class kakaoView(View):
    def post(self, request):
        try:
            access_token = request.headers.get('Authorization', None)
            url          = 'https://kapi.kakao.com/v2/user/me'
            headers      = {'Authorization': f'Bearer {access_token}',
                            'Content-type': 'application/x-www-form-urlencoded;charset=utf-8'
            }

            response      = requests.get(url,headers=headers)
            data          = response.json()
            kakao_user_id = data['id']
            email         = data['kakao_account']['email']
            nickname      = data['kakao_account']['profile']['nickname']

            if not User.objects.filter(kakao_user_id=kakao_user_id).exists():
                User.objects.create(
                    kakao_user_id = kakao_user_id,
                    email         = email,
                    nickname      = nickname,
                    is_social     = True
                )

            token = jwt.encode({'id': User.objects.get(kakao_user_id=kakao_user_id).id}, my_settings.SECRET['secret'], algorithm=my_settings.ALGORITHM)
            return JsonResponse({'TOKEN': token, 'NICKNAME': nickname},status=200)

        except KeyError:
            return JsonResponse({'MESSAGE': 'KEY_ERROR'},status=401)

0개의 댓글