티스토리 뷰

파이썬/장고

Django kakao OAuth login 구현

글을 쓰는 개발자 2021. 6. 29. 13:48
반응형

 

python -m venv env

우선 가상환경 먼저 세팅을 해준다.

가상환경 작동하는 방법은 " .\env\Scripts\activate " 입니다.

 

pip install django djangorestframework requests

설치 할 것은 위와 같다.

 

django-admin startproject backend .
django-admin startapp accounts

 

그 다음 카카오 시크릿 키와 장고 안에 기본적으로 가지고 있는 시크릿 키를 json파일로 옮기는 작업을 해줘야 한다.

 

settings.py

import os
import json

secret_file = os.path.join(BASE_DIR, "secrets.json")
secrets = None
with open(secret_file) as f:
    secrets = json.loads(f.read())
    

SECRET_KEY = secrets['SECRET_KEY']


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    ## 추가 목록 ##
    'django.contrib.sites',
    'accounts.apps.AccountsConfig',
    'rest_framework'

]

## 카카오 키들은 나중에 accounts.view에서 쓰일 예정
SOCIAL_OUTH_CONFIG = {
    'KAKAO_REST_API_KEY': secrets['KAKAO_REST_API_KEY'],
    "KAKAO_REDIRECT_URI": secrets['KAKAO_REDIRECT_URI'],
    "KAKAO_SECRET_KEY": secrets['KAKAO_SECRET_KEY']
}

 

secrets.json

 

{
    "SECRET_KEY":"django-#############################################3",
    "KAKAO_REST_API_KEY":"#################################",
    "KAKAO_REDIRECT_URI":"http://localhost:8000/accounts/kakao/login/callback/",
    "KAKAO_SECRET_KEY": "############################"

}

 

backend/urls.py

from django.contrib import admin
from django.urls import path
from django.urls.conf import include
from accounts.views import getUserInfo
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('accounts.urls')),
    path('accounts/kakao/login/callback/', getUserInfo),
]

 

 

애플리케이션을 만들고 나서 플랫폼을 만들고 Web부분에 사이트 도메인을 등록하자

그리고 밑에 보면 하이퍼링크로 Redirect URI 등록해야합니다. 등록하러가기  를 눌러주도록 하자

 

필자의 경우에는 다음과 같이 작성하였다. 

http://localhost:8000/accounts/kakao/login/callback/

그리고 활성화 설정 ON이 되도록 하자. (아니면 안된다 이것 때문에 30분 버린듯 ㅎㅎ)

 

 

카카오 문서를 보면 다음과 같은 이미지가 있는데 이것을 이해하는 것이 중요하다.

1. 사용자가 카카오서버에게 CODE를 요청한다.
2. 서버가 사용자에게 Redirect를 일으켜서 CODE 값을 가지고 있는 Callback URI를 돌려준다.
3. 사용자는 해당 코드와 카카오 서버가 요구하는 POST Body를 작성하여 다시 요청한다.
4. 카카오 서버가 사용자로부터 해당 값을 제대로 받았으면 access-token,refresh-token을 돌려준다.
5. 해당 토큰 값으로 적절히 사용하면 된다.

 

1. CODE 요청하기

CODE KAKAO DEVELOPERS 부분

 

요구사항을 보면 client_id, redirect_uri, response_type 을 요구하는 것을 알 수 있다.

 

accounts/views.py

from django.shortcuts import redirect
from backend.settings import SOCIAL_OUTH_CONFIG
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny

@api_view(['GET'])
@permission_classes([AllowAny, ])
def kakaoGetLogin(request):
    CLIENT_ID = SOCIAL_OUTH_CONFIG['KAKAO_REST_API_KEY']
    REDIRET_URL = SOCIAL_OUTH_CONFIG['KAKAO_REDIRECT_URI']
    url = "https://kauth.kakao.com/oauth/authorize?response_type=code&client_id={0}&redirect_uri={1}".format(
        CLIENT_ID, REDIRET_URL)
    res = redirect(url)
    return res

첫 번째로 settings.py 에서 미리 저장해놓은 kakao key들을 불러온다.

그리고 해당 정보들을 알맞은 위치에 집어 넣어주고 redirect를 시킨다.

 

 

이렇게 redirect가 되면 

[29/Jun/2021 13:37:39] "GET /accounts/kakao/login/callback/?code={CODE_VALUE} HTTP/1.1" 200 5869

이렇게 재요청이 된다.

우리는 이것을 이용하여 바로 유저 정보를 볼 수 있게 작성할 것이다.

 

 

http://localhost:8000/accounts/kakao/login/callback/ 으로 다시 요청이 올 때 code값을 가지고 온다.

 

 

다음 표와 같이 작성하면 된다. 

code는 redirect 되면서 가져오게 되고 client_id와 redirect_uri는 이미 가지고 있으며 grant_type은 authorization_code로 고정되어 있으므로 해당 값을 묶어서 보내면 된다.

@api_view(['GET'])
@permission_classes([AllowAny, ])
def getUserInfo(reqeust):
    CODE = reqeust.query_params['code']
    url = "https://kauth.kakao.com/oauth/token"
    res = {
            'grant_type': 'authorization_code',
            'client_id': SOCIAL_OUTH_CONFIG['KAKAO_REST_API_KEY'],
            'redirect_url': SOCIAL_OUTH_CONFIG['KAKAO_REDIRECT_URI'],
            'client_secret': SOCIAL_OUTH_CONFIG['KAKAO_SECRET_KEY'],
            'code': CODE
        }
    headers = {
        'Content-type': 'application/x-www-form-urlencoded;charset=utf-8'
    }
    response = requests.post(url, data=res, headers=headers)
    # 더 있음

위와 같이 보내면 해당 요구하는 바를 다 이룬 것과 같다. 

그러면 다음 아래와 같은 형식으로 응답이 올 것이다.

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
    "token_type":"bearer",
    "access_token":"{ACCESS_TOKEN}",
    "expires_in":43199,
    "refresh_token":"{REFRESH_TOKEN}",
    "refresh_token_expires_in":25184000,
    "scope":"account_email profile"
}

이 때 우리가 필요한 것은 "access_token"이다. 그러므로 해당 값만 추출하고 헤더에 넣은 다음 적절히 사용하면 된다.

 

우리는 간단하게 토큰의 유저 정보를 보도록 하겠다.

 

@api_view(['GET'])
@permission_classes([AllowAny, ])
def getUserInfo(reqeust):
    CODE = reqeust.query_params['code']
    url = "https://kauth.kakao.com/oauth/token"
    res = {
            'grant_type': 'authorization_code',
            'client_id': SOCIAL_OUTH_CONFIG['KAKAO_REST_API_KEY'],
            'redirect_url': SOCIAL_OUTH_CONFIG['KAKAO_REDIRECT_URI'],
            'client_secret': SOCIAL_OUTH_CONFIG['KAKAO_SECRET_KEY'],
            'code': CODE
        }
    headers = {
        'Content-type': 'application/x-www-form-urlencoded;charset=utf-8'
    }
    response = requests.post(url, data=res, headers=headers)
    # 그 이후 부분
    tokenJson = response.json()
    userUrl = "https://kapi.kakao.com/v2/user/me" # 유저 정보 조회하는 uri
    auth = "Bearer "+tokenJson['access_token'] ## 'Bearer '여기에서 띄어쓰기 필수!!
    HEADER = {
        "Authorization": auth,
        "Content-type": "application/x-www-form-urlencoded;charset=utf-8"
    }
    res = requests.get(userUrl, headers=HEADER)
    return Response(res.text)

이와 같이 작성하고 돌리게 되면 

이와 같이 응답이 오게 됩니다.

 

 

VIXXPARK/django-remind

Contribute to VIXXPARK/django-remind development by creating an account on GitHub.

github.com

 

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함