반응형

카카오 로그인 ( 앱 연결하기 )

OAuth란?
비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는 접근 위임을 위한 개방형표준이다. 쉽게 말해서는 카카오가 아닌 다른 애플리케이션에서 카카오의 회원정보를 가져오기 위한 인증?방식이라고 할 수 있을 것 같다.
자세한정보는 https://ko.wikipedia.org/wiki/OAuth에서 볼 수 있다.
  • 카카오 REST API는 oauth 2.0을 지원한다고 한다.

  • 간략히 카카오 로그인 절차를 설명하자면

    code요청 -> code를 사용하여 token을 요청 -> token을 이용하여 앱 연결, 정보가져오기 등이 가능
  • 그럼 이제부터 본격적으로 REST API를 사용하여 Django에서 카카오 로그인을 만들어 보겠습니다.

  • 코드받기

    Screen Shot 2019-08-14 at 2 49 57 AM
  • 카카오 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.pyoauth 함수를 작성해줍니다.

    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를 얻어오게 됩니다.

    Screen Shot 2019-08-14 at 11 38 41 PM
  • 위에서 만들어놓은 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 를 실행하고 브라우저로 접속을 한 뒤 버튼을 눌러봅니다.

    Screen Shot 2019-08-14 at 11 59 30 PM Screen Shot 2019-08-14 at 11 59 55 PM Screen Shot 2019-08-15 at 12 00 05 AM
  • 성곡적으로 로그인을 하고 동의를 하신 다음 '동의하고 계속하기'를 누르면 다시 index페이지로 가지는 것을 확인 하실 수 있습니다.

    Screen Shot 2019-08-15 at 12 03 13 AM
  • 터미널창에서 확인해보시면 code = G7jz... 으로 제대로 코드를 받아오시는 것도 확인해볼 수 있습니다.

  • 토큰 받기

  • code를 받아왔으니 이제는 code를 사용해서 토큰을 받아와야 사용자 정보들을 요청할 수 있습니다.

  • 토큰에는 'Access_token'과 'Refresh_token'이 있는데 우선 'Access_token'만 얻어와 보겠습니다.

    Screen Shot 2019-08-15 at 12 13 15 AM
  • 위와 같이 POST로 요청을 하면 아래와 같이 JSON 객체로 응답을 해줍니다.

    Screen Shot 2019-08-15 at 12 14 38 AM
  • 그럼 이제 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 함수에 추가를 해줍니다. 그리고 브라우저에서 카카오 로그인을 다시 해줍니다.

    Screen Shot 2019-08-15 at 12 19 01 AM
  • access_token_request_uri 가 print되는 것을 확인하실 수 있습니다. 이 uri를 띄워보면 아래와 같이 'access_token', 'refresh_token'등 각종 정보들이 json형태로 뜨는 것을 확인하실 수 있습니다.

    Screen Shot 2019-08-15 at 12 19 49 AM
  • 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 를 통해 설치를 해주셔야합니다.
    • .json() 함수를 사용하여 json객체를 읽을 수 있게 변환해줍니다.
    • access_token에 json객체안의 'access_token'을 넣어줍니다.
    • 그리고 print를 해주면 아래와 같이 토큰을 불러오는 것을 확인할 수 있습니다.
    Screen Shot 2019-08-15 at 12 53 17 AM
  • 이렇게 토큰까지 불러오는데 성공한겁니다!!!

반응형

BELATED ARTICLES

more