OAuth (Open Authorization)


Django 에서 OAuth를 이용해 인증처리를 하는 방법을 알아보겠습니다.

가. OAuth Toolkit 설치

  • pip install django-oauth-toolkit

나. 프로젝트 생성

1.프로젝트생성

  • django-admin startproject pjt_oauth

2.프로젝트 설정

  • 프로젝트디렉토리/pjt_oauth/settings.py
INSTALLED_APPS = [
    ...
    'oauth2_provider', # 추가
    'rest_framework',
]

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.ext.rest_framework.OAuth2Authentication', # 디폴트 인증 클래스 추가
    ), 
}

다.앱생성

1.sign처리 앱생성

  • cd pjt_oauth
  • python manage.py startapp sign
  • python manage.py startapp user ( 사용자 처리는 이전 장의 인증처리 참조 )

2.serializer 생성

  • 프로젝트디렉토리/sign/serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User

class SignUpSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'email', 'password')
        extra_kwargs = {
            'password': {'write_only': True},
        }

    def create(self, validated_data):
        user = User(
            email=validated_data['email'],
            username=validated_data['username']
        )
        user.set_password(validated_data['password'])
        user.save()
        return user

3.permission 생성

  • 프로젝트디렉토리/sign/permissions.py
from rest_framework import permissions

class IsAuthenticatedOrCreate(permissions.IsAuthenticated):
    def has_permission(self, request, view):
        if request.method == 'POST':
            return True
        return super(IsAuthenticatedOrCreate, self).has_permission(request, view)

4.view 수정

  • 프로젝트디렉토리/sign/views.py
from rest_framework import generics
from sign.permissions import IsAuthenticatedOrCreate
from sign.serializers import SignUpSerializer
from django.contrib.auth.models import User

class SignUp(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = SignUpSerializer
    permission_classes = (IsAuthenticatedOrCreate,)

5.url 수정

  • 프로젝트디렉토리/pjt_oauth/urls.py
from django.conf.urls import url, include
from django.contrib import admin
from rest_framework import permissions

urlpatterns = [
    url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')),
    url(r'^sign_up/', include('sign.urls')),
    url(r'^admin/', include(admin.site.urls)),
]
  • 프로젝트디렉토리/sign/urls.py 생성
from django.conf.urls import url
from sign import views

urlpatterns = [
    url(r'^$', views.SignUp.as_view(), name="sign_up"),
]

라.사용자 등록

1.파이썬 서버실행

  • python manage.py runserver

2.포스트맨에서 사용자등록

포스트맨을 실행하고, http://127.0.0.1:8000/sign_up 으로 json 데이터를 전송해서 사용자를 등록한다.

  • 주소
    http:127.0.0.1:8000

  • Method
    POST

  • Headers
    Content-Type : application/json

  • Body (Raw)

{
    "username":"test",
    "email":"[email protected]",
    "password":"qwer1234"
}

send 버튼으로 데이터를 전송하면 아래와 같이 등록된 사용자 이름이 Response Body 에 담겨온다.

마.토큰생성

이제 등록된 사용자로 토큰을 생성해 보겠습니다.

1.클라이언트 어플리케이션생성

Client ID와 Secret 을 사용하기 위해 관리자 화면에 로그인 후에 아래와 같이 Application 화면으로 이동해서 앱을 생성해줍니다.

2.토큰 요청

앱을 생성 하였으면 해당 앱의 Client id 와 secret 을 이용해서 token 을 생성해보습니다.

다시 포스트맨을 열고 이번에는 http://127.0.0.1:8000/o/token 주소로 아래와 같이 데이터를 전송합니다.

  • 주소 : http://127.0.0.1:8000/o/token
  • Method : POST
  • Body : x-www-from-urlencoded client_id = 위에서 생성된아이디
    client_secret = 위에서 생성된아이디 grant_type = password username = test password = qwer1234

정상적으로 입력되었다면 아래와 같이 access_token 결과값을 받게 됩니다.

results matching ""

    No results matching ""