[2nd-Project]README - 카카오 소셜로그인 (수정필요)

김광일·2022년 3월 20일
0

PROJECT

목록 보기
4/5

2차 프로젝트를 진행하며, 새롭게 들어온 것이 바로 소셜로그인!
듣기로는 그냥 카카오 api 만 가져다 쓰면 된다고 했는데.. 하다보니 꽤나 어렵고 난해한 부분이 많았다.

import requests, json, jwt, uuid

from requests.exceptions import Timeout

from django.http         import HttpResponse, JsonResponse
from django.views        import View
       
from .models             import User, Gender
from .decorators         import login_decorator
from my_settings         import SECRET_KEY, ALGORITHM

class SignInView(View):
    def get(self,request):
        try:
            kakao_access_token   = request.headers.get('Authorization',None)
            USER_INFORMATION_API = 'https://kapi.kakao.com/v2/user/me'
            user_information     = requests.get(
                USER_INFORMATION_API,
                headers = {
                    'Authorization' : f'Bearer {kakao_access_token}'
                }, 
                timeout = 5
            ).json()

            kakao_id             = user_information['id']
            POINT                = 500000
            gender_id            = Gender.objects.get(sex = user_information['kakao_account']['gender']).id
            
            user, is_created = User.objects.get_or_create(
                kakao_id  = kakao_id,
                gender_id = gender_id,
                defaults  = {
                    'point'         : POINT,
                    'date_of_birth' : '1945-08-15'
                }
            )

            access_token = jwt.encode({'id' : kakao_id}, SECRET_KEY, ALGORITHM)

            status = 201 if is_created else 200

            return JsonResponse({'access_token' : access_token}, status = status)
            
        except KeyError:
            return JsonResponse({'message' : 'KEY_ERROR'}, status = 400)
        except Timeout:
            return JsonResponse({'message' : 'TIME_OUT_ERROR'}, status = 408)

    
    @login_decorator
    def patch(self, request):
        try:
            user = request.user

            data = json.loads(request.body)

            nickname      = data['nickname']
            date_of_birth = data['date_of_birth']
        
            user.nickname      = nickname
            user.date_of_birth = date_of_birth 
            
            user.save()

            return HttpResponse(status = 200)

        except KeyError:
            return JsonResponse({'message' : 'KEY_ERROR'}, status = 400)

원래 정석대로 하려면 카카오에서 access_token 도 받아오고 해야할 것도 더 있지만, 이번엔 프론트에서 전반적인 것들을 다 해주고, 우리는 그 토큰을 받아 우리가 사용할 토큰으로 변환해주는 작업만 진행하였다.

profile
부족함 없이 공부하자

0개의 댓글