TIL 21. Django_Kakao Social LogIn(Back-end)

Drageon Leeยท2021๋…„ 11์›” 21์ผ
0

TIL_Django

๋ชฉ๋ก ๋ณด๊ธฐ
6/8

Today's topic

๐Ÿ‘‰ Kakao Social LogIn

์ด๋ฒˆ post์—์„œ๋Š” project๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์•Œ๊ฒŒ๋œ KakaoSocialLogIn์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ ์ž ํ•œ๋‹ค

๐Ÿ‘‰ Social Log In ๊ฐœ๋…

Kakao ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ ํ•˜๋ฉด ๋กœ๊ทธ์ธ ๊ณ„์ • ์ •๋ณด๋กœ web page service์™€ ์—ฐ๊ฒฐํ•˜๊ณ  ๋งŒ์•ฝ ๊ณ„์ • ์ •๋ณด๊ฐ€ ํ•ด๋‹น web page์— ๋“ฑ๋ก(๊ฐ€์ž…)์ด ๋˜์–ด์žˆ์œผ๋ฉด ๋กœ๊ทธ์ธ์ด ๋˜๊ฒŒ ํ•˜๊ณ , ๋งŒ์•ฝ ๋“ฑ๋ก์ด ์•ˆ๋˜์–ด ์žˆ์œผ๋ฉด ๊ฐ€์ž… ํ›„ ๋กœ๊ทธ์ธ ๋˜๋Š” process์ด๋‹ค.

๐Ÿ‘‰ Kakao Log In process

  • Front-end
  1. F/E(client)์—์„œ OAuth๋ฅผ ํ†ตํ•ด kakaotalk API server์œผ๋กœ ์ธ์ฆ ์ฝ”๋“œ ์š”์ฒญ
  2. Kakao Server์—์„œ ์ธ์ฆ ์ฝ”๋“œ ์ „๋‹ฌ
  3. F/E์—์„œ ๋ฐ›์€ ์ธ์ฆ ์ฝ”๋“œ๋กœ Kakao server์— Access Token์„ ์š”์ฒญ
  4. F/E์—์„œ Access Token์„ ๋ฐ›์•„ B/E์— Access Token์„ ์ „๋‹ฌ
  • Back-end
  1. F/E๋กœ ๋ถ€ํ„ฐ ๋ฐ›์€ Access Token์œผ๋กœ Kakao server์— ํ•ด๋‹น Access Token์— ๋งž๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ
  2. Kakao server๋กœ ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž ์ •๋ณด์— ๋Œ€ํ•ด ์š”์ฒญ ๋ฐ›์•„ web page ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ์ž ํ™•์ธ ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋  Access Token ์ƒ์„ฑ(web page์— ๋“ฑ๋ก์ด ์•ˆ๋œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ๋“ฑ๋ก ํ›„ Token ๋ฐœ๊ธ‰, ๊ธฐ์กด์— ๋“ฑ๋ก์ด ๋˜์–ด ์žˆ๋Š” ์‚ฌ์šฉ์ž์ธ ๊ฒฝ์šฐ ์ •๋ณด ํ™•์ธ ํ›„ Token ๋ฐœ๊ธ‰)

๐Ÿ‘‰ Back-end์—์„œ ํ•„์š”ํ•œ ์ฝ”๋“œ

  1. F/E๋กœ ๋ถ€ํ„ฐ Access Token ๋ฐ›๊ธฐ

    class KakaotalkSignInView(View):
        def get(self, request):
            try : 
                access_token = request.headers.get('Authorization')
  2. B/E์—์„œ Kakao server๋กœ ์ •๋ณด ์š”์ฒญํ•ด์„œ ๋ฐ›๊ธฐ

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

    "https://kapi.kakao.com/v2/user/me" ์„œ๋ฒ„๋กœ Access Token์œผ๋กœ ์š”์ฒญ์„ ํ•˜๋ฉฐ, requests.get์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ Access Token๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋ฐ›๋„๋ก ์š”์ฒญํ•จ.

  3. ๋ฐ›์€ ์ •๋ณด๋ฅผ json ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ๋ถˆ๋Ÿฌ ์‚ฌ์šฉํ•จ

    profile_information_json = profile_information.json()
                profile_id               = profile_information_json["id"]
                email                    = profile_information_json["kakao_account"]["email"] 
                nickName                 = profile_information_json["properties"]["nickname"]
                profile_image            = profile_information_json["kakao_account"]["profile"]["profile_image_url"]

๐Ÿ‘‰ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ์ „์ฒด ์ฝ”๋“œ

import json, jwt, requests

from django.http import JsonResponse
from django.views import View
from django.conf import settings

from .models import User

class KakaotalkSignInView(View):
    def get(self, request):
        try : 
            access_token = request.headers.get('Authorization')

            if not 'Authorization':
                return JsonResponse({"message" : "No_access_token"}, status=404)

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

            profile_information_json = profile_information.json()
            profile_id               = profile_information_json["id"]
            email                    = profile_information_json["kakao_account"]["email"] 
            nickName                 = profile_information_json["properties"]["nickname"]
            profile_image            = profile_information_json["kakao_account"]["profile"]["profile_image_url"]

            user, created     = User.objects.get_or_create(
                social_id     = profile_id,
                nickname      = nickName,
                email         = email,
                profile_image = profile_image)
            jwt_token         = jwt.encode({"id" : user.id}, settings.SECRET_KEY, algorithm=settings.ALGORITHM)
            HttpStatusCode = 201 if created else 200 
            
            return JsonResponse({"Token" : jwt_token}, status = HttpStatusCode)                
        
        except KeyError:
            return JsonResponse({"message" : "Key_Error"}, status = 401)
        except User.DoesNotExist:
            return JsonResponse({"message" : "Does_Not_Exist"}, status=404)

My opinion

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” kakao social ๋กœ๊ทธ์ธ ๋ฐฉ๋ฒ•์˜ back-end ํŒŒํŠธ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ process๋ฅผ ์ •๋ฆฌ๋œ ์ž๋ฃŒ๋“ค์€ ๋ช‡๋ช‡ ๋ณด์•˜์œผ๋‚˜, back-end ์ •๋ณด์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌ๋œ ๊ฒƒ์€ ์ž˜ ๋ณด์ง€ ๋ชปํ•ด์„œ back-end์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค. ์†Œ์…œ๋กœ๊ทธ์ธ์ด ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š” ์ง€ ๊ฐ์ด ์•ˆ์žกํ˜”์—ˆ๋Š”๋ฐ kakao developers์˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•จ์œผ๋กœ์จ ํ๋ฆ„์ด ์ดํ•ด๊ฐ€ ๋˜์—ˆ๊ณ  ๊ทธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฒ€์ƒ‰ ๋ฐ ์—ฌ๋Ÿฌ feed back์„ ํ†ตํ•ด ๊ตฌํ˜„์„ ์™„์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ข€ ๋” ์ถ”๊ฐ€์ ์œผ๋กœ ์ˆ˜์ •์‚ฌํ•ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ํ•ด๋‹น code๋กœ๋„ ๊ตฌํ˜„ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์„ ๋•Œ ์ข€ ๊ธฐ๋ปค๋‹ค.

์ฐธ๊ณ  ๋ฌธํ—Œ : https://developers.kakao.com/docs/latest/ko/kakaologin/common

profile
์šด๋™ํ•˜๋Š” ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€