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:8000Method
POSTHeaders
Content-Type : application/jsonBody (Raw)
{
"username":"test",
"email":"[email protected]",
"password":"qwer1234"
}
send 버튼으로 데이터를 전송하면 아래와 같이 등록된 사용자 이름이 Response Body 에 담겨온다.
마.토큰생성
이제 등록된 사용자로 토큰을 생성해 보겠습니다.
1.클라이언트 어플리케이션생성
Client ID와 Secret 을 사용하기 위해 관리자 화면에 로그인 후에 아래와 같이 Application 화면으로 이동해서 앱을 생성해줍니다.
Name : test
Client id : 자동생성
Client secret : 자동생성
Client type : Confidential
- Authorization grant type : Resource owner password-based
- Redirect uris : http://127.0.0.1:8000/user (임시로 사용자 목록으로 돌아가도록 변경
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 결과값을 받게 됩니다.