카카오 로그인 ( 앱 연결하기 )
OAuth란?
비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는 접근 위임을 위한 개방형표준이다. 쉽게 말해서는 카카오가 아닌 다른 애플리케이션에서 카카오의 회원정보를 가져오기 위한 인증?방식이라고 할 수 있을 것 같다.
자세한정보는 https://ko.wikipedia.org/wiki/OAuth에서 볼 수 있다.
카카오 REST API는 oauth 2.0을 지원한다고 한다.
간략히 카카오 로그인 절차를 설명하자면
code요청 -> code를 사용하여 token을 요청 -> token을 이용하여 앱 연결, 정보가져오기 등이 가능
그럼 이제부터 본격적으로 REST API를 사용하여 Django에서 카카오 로그인을 만들어 보겠습니다.
코드받기
카카오 REST API 개발가이드를 보면 위와 같이 설명이 되어있습니다.
알기쉽게 다시 설명을 해드리면 GET 으로
/oauth/authorize?client_id={app_key}&redirect_uri={redirect_uri}&response_type=code
와 같은 요청을 보내면 kakao에서 client_id를 확인 후 code와 함께적어주는 redirect_uri ( 위의 설정에서 로그인 Redirect URI에서 설정한 uri )로 redirect를 시켜준다는 뜻입니다. ( 지금은 잘 이해가 안가셔도 코드를 따라 쳐보시면 쉽게 이해가 가실수도 있습니다. )
우선, Django에서
accounts
앱을 만들어주고blog_project/urls.py
에 url설정을 해줍니다.from django.contrib import admin from django.urls import path, include import accounts.views urlpatterns = [ path('admin/', admin.site.urls), path('', accounts.views.index, name='index'), path('accounts/', include('accounts.urls')), ]
참고) 저의 프로젝트 폴더 구조입니다. ( 본인 구조에 맞춰 비교하시면서 따라하시면 됩니다. )
. ├── accounts │ ├── admin.py │ ├── apps.py │ ├── migrations │ ├── models.py │ ├── templates │ ├── tests.py │ └── views.py ├── blog_project │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py
Redirect URI를
/oauth
로 설정을 해주었으니accounts/views.py
에oauth
함수를 작성해줍니다.from django.shortcuts import render, redirect def oauth(request): return redirect('index')
blog_project/urls.py
에도 url을 추가해줍니다.path('oauth/', accounts.views.oauth, name='oauth'),
이제 code를 받아오기 위한 함수를
accounts/views.py
에 만들어줍니다.def kakao_login(request): login_request_uri = 'https://kauth.kakao.com/oauth/authorize?' client_id = '96de9a57cc579cc6b842a8f1d4bd8620' redirect_uri = 'http://127.0.0.1:8000/oauth' login_request_uri += 'client_id=' + client_id login_request_uri += '&redirect_uri=' + redirect_uri login_request_uri += '&response_type=code' return redirect(login_request_uri)
- client_id : REST API 키를 입력해줍니다.
- redirect_uri : 설정에서 '로그인 Redirect uri'에 설정해준 uri를 입력해줍니다.
제대로 요청이 된다면 code를 얻어오게 됩니다.
위에서 만들어놓은
oauth
함수에서 code를 불러와서 띄워보도록 하겠습니다.def oauth(request): code = request.GET['code'] print('code = ' + str(code)) return redirect('index')
테스트를 위하여
index.html
에 버튼을 하나 만들겠습니다.<a href="{% url 'kakao_login' %}"><button>카카오 로그인</button></a>
runserver
를 실행하고 브라우저로 접속을 한 뒤 버튼을 눌러봅니다.성곡적으로 로그인을 하고 동의를 하신 다음 '동의하고 계속하기'를 누르면 다시 index페이지로 가지는 것을 확인 하실 수 있습니다.
터미널창에서 확인해보시면
code = G7jz...
으로 제대로 코드를 받아오시는 것도 확인해볼 수 있습니다.토큰 받기
code를 받아왔으니 이제는 code를 사용해서 토큰을 받아와야 사용자 정보들을 요청할 수 있습니다.
토큰에는 'Access_token'과 'Refresh_token'이 있는데 우선 'Access_token'만 얻어와 보겠습니다.
위와 같이 POST로 요청을 하면 아래와 같이 JSON 객체로 응답을 해줍니다.
그럼 이제 django에서 요청을 해보겠습니다.
def oauth(request): code = request.GET['code'] print('code = ' + str(code)) client_id = '96de9a57cc579cc6b842a8f1d4bd8620' redirect_uri = 'http://127.0.0.1:8000/oauth' access_token_request_uri = "https://kauth.kakao.com/oauth/token?grant_type=authorization_code&" access_token_request_uri += "client_id=" + client_id access_token_request_uri += "&redirect_uri=" + redirect_uri access_token_request_uri += "&code=" + code print(access_token_request_uri) return redirect('index')
위와 같이
oauth
함수에 추가를 해줍니다. 그리고 브라우저에서 카카오 로그인을 다시 해줍니다.access_token_request_uri
가 print되는 것을 확인하실 수 있습니다. 이 uri를 띄워보면 아래와 같이 'access_token', 'refresh_token'등 각종 정보들이 json형태로 뜨는 것을 확인하실 수 있습니다.accounts/views.py
에 있는oauth
함수에 밑에 내용을 추가해줍니다.import requests def oauth(request): ... access_token_request_uri_data = requests.get(access_token_request_uri) json_data = access_token_request_uri_data.json() access_token = json_data['access_token'] print(access_token) return redirect('index')
- requests.get()을 통해 access_token_request_uri에서 json객체를 받아와 줍니다.
- requests를 사용하기 위해서는
pip install requests
를 통해 설치를 해주셔야합니다.
- requests를 사용하기 위해서는
- .json() 함수를 사용하여 json객체를 읽을 수 있게 변환해줍니다.
- access_token에 json객체안의 'access_token'을 넣어줍니다.
- 그리고 print를 해주면 아래와 같이 토큰을 불러오는 것을 확인할 수 있습니다.
- requests.get()을 통해 access_token_request_uri에서 json객체를 받아와 줍니다.
이렇게 토큰까지 불러오는데 성공한겁니다!!!
'Web > Django' 카테고리의 다른 글
[Django] 템플릿 언어(Template Language) 사용법 (0) | 2019.09.18 |
---|---|
[Django] 웹에서 "Hello world"를 띄워보기 (0) | 2019.09.18 |
[Django] 기본환경 setting (0) | 2019.09.18 |
[Django]kakao REST API를 사용해서 프로필 불러오기 - ( 3 ) 카카오 프로필 불러오기 (0) | 2019.08.21 |
[Django]kakao REST API를 사용해서 프로필 불러오기 - ( 1 ) 앱 만들기 (0) | 2019.08.21 |