(5.2) 장고 토큰 인증(Django Token Authentication)
안녕하세요? 죠니입니다.
지난 포스팅의 마지막에 언급했던 것을 다시 상기시켜 봅니다.
이제 우리에게 필요한 것은 인증을 하도록 해 주는 것 입니다. 그렇게 하기 위해 이제 할 일은
1. Registration(등록) API 만들기: 계정 생성을 위함
2. Login API 만들기
3. TOKEN
- 그리고 우리가 로그인을 할 때 장고 서버로부터 토큰을 받게 될 것 입니다.
- 토큰을 받으면 받은 토큰을 header들과 함께(또는 headers 로부터) 보냅니다.
- 그렇게 하면 lead를 추가, fetch(호출)과 같은 것들을 할 수 있습니다.
결론은 토큰을 받는 인증 플로우를 만들어 주는 것 입니다.
그러면 바로 시작해 볼까요??
(6) 토큰 인증 방식 적용 전 Postman 을 통해 빠르게 테스트 진행
- 이미 설치해 사용중인 Django rest knox 가 있습니다.
- 확실하지 않다면 프로젝트의 가장 바깥쪽 root 폴더에 위치한 Pipfile에서 세부 내역을 살펴 봅니다.
(7) /leadmanager/leadmanager/settings.py 수정
- knox와 rest framework를 사용할 것 이기에 INSTALLED_APPS 항목에 추가 및 REST_FRAMEWORK를 추가 작성해 줍니다.
- 아래의 코드 중 46번째 줄의 REST_FRAMEWORK 는 튜플(tuple) 입니다.
- 이후 일어날 오류에 대해 해결할 방법을 미리 명시합니다.다음에 제시해드리는 코드와 같이 46번 ~ 48번줄을 작성해 주세요.
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSED':
('knox.auth.TokenAuthentication',)
}
# 3번 줄의 끝 부분에 쉼표( , ) 를 꼭 넣어야 함을 명심해 주세요
- 이러고 저장만 하면 다음과 같은 오류가 발생합니다.
- 마이그레이션(Migration)을 해 줘야 하는데 아직 안했기 때문입니다.
- 서버를 잠시 멈춥니다.
- 다음의 명령어로 마이그레이션을 진행해 줍니다.
$ python manage.py migrate
- 서버를 재시작 합니다.
$ python manage.py runserver 0:8000
(8) User 생성과 로그인을 위한 serializer 만들기
- 이번엔 장고 앱을 만드는 차례입니다.
- 다음의 명령어로 accounts 라는 이름의 장고 앱을 생성해 줍니다.
$ python manage.py startapp accounts
- 그 결과 다음과 같이 accounts 라는 이름의 앱 폴더가 생성되는 것을 볼 수 있습니다.
- 서버를 재가동 합니다.
$ python manage.py runserver 0:8000
- 새로운 기능의 앱을 추가했으니 seeings.py 파일에도 추가해줘야 합니다.
- /leadmanager/accounts/serializers.py 파일 생성 및 코드 작성
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
|
// /leadmanager/account/serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User
from django.contrib.auth import authenticate
# User Serializer
# 유저(사용자) 시리얼라이저는 간단하기도하고 Delete serializer와도 매우 유사합니다.
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
# Register Serializer
class RegisterSerializer(serialigers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
extra_kwards = {'password': {'write_only': True}}
def create(self, validated_data):
usere = User.objects.create_user(validated_data
['username'], validated_data['email'], validated_data['password'])
return user
# Login Serializer
|
cs |
- /leadmanager/accounts/api.py 파일 생성 및 코드 작성
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
|
// /leadmanager/account/api.py
from rest_framework import generics, permissions
from rest_framework.response import Response
from knox.models import AuthToken
from .serializers import UserSerializer, RegisterSerializser
# Register API
class RegisterAPI(generics.GenericAPIView)
serializer_class = RegisterSerializer
## kwargs basically means it can take more arguments
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
return Response({
"user": UserSerializer(user,
context=self.get_serializer_context()).data,
"token": AuthToken.objects.create(user)
})
# Login API
# Get User API
|
cs |
- 여러분이 vue라던지 react 또는 무엇을 사용하건 저 토큰을 통해 인증을 받아 진행하기 서버에서는 당신이 누구인지와 권한에 대한 부분을 판별하게 됩니다.
- 그리고 반응형으로 만들어줄 필요 또한 있습니다.
- /leadmanager/accounts/urls.py
1
2
3
4
5
6
7
8
9
|
// /leadmanager/accounts/urls.py 작성
from django.ruls import path, include
from .api import RegisterAPI
from knox import views as knox_views
urlpatterns = [
path('api.auth', include('knox.urls')),
path('api/auth/register', RegisterAPI.as_view())
]
|
cs |
- /leadmanager/leadmanager/urls.py 수정
- 다음과 같이 urls.py 파일에 accounts 를 위한 코드를 추가해 줍니다.
1
2
3
4
5
6
7
8
9
|
// /leadmanager/leadmanager/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('', include('frontend.urls')),
path('', include('leads.urls')),
path('', include('accounts.urls'))
]
|
cs |
(9) 파이썬 서버 재가동
- 다음의 명령어로 서버를 재가동 합니다.
$ python manager.py runserver 0:8000
(10) Postman으로 테스트 작업 진행하기
- 먼저 Headers를 설정해줍니다.
- POST | http:// [ip 주소]:8000/api/auth/register 을 입력합니다.
- KEY는 Content-Type, VALUE는 application/json 으로 지정해 줍니다.
- Body에서 raw 형식으로 작업을 시작합니다.
- 등록할 user data를 다음과 같이 입력하고 Send 버튼을 클릭합니다.
- 에러가 발생되는 것은 당연한 일이니 당황하지 말고 그대로 진행합니다.
- 다음 과정이 이제 발생될 에러를 해결하는 과정입니다.
- 다음과 같이 500번 에러가 발생합니다.
- 다음은 콘솔창에서 발생하는 에러메세지 입니다.
- 해결: (7)번의 settings.py 내의 코드의 오류를 해결해 주면 됩니다.(자세한 사항은 본 포스팅의 (7)번을 참고해 주세요.)
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSED':
('knox.auth.TokenAuthentication',)
}
# 3번 줄의 끝 부분에 쉼표( , ) 를 꼭 넣어야 함을 명심해 주세요
- 다시 서버를 재가동합니다.
- Postman에서 POST send를 재시도 합니다.
- 위와 같이 token이 발행되면 정상 작동을 하는 것 입니다.
- 하지만!!! 버전 업데이트가 되면서 바뀐 것이 있어서 그런지 해당 강의의 댓글에서 오류가 발생했었음을 알 수 있었습니다. 미리 정리해 두도록 하겠습니다.
- 내용은 다음과 같습니다. [현재 기준 시간: 2019년 5월 29일 오후 8시 41분]
- 가장 모범 답변은 다음과 같았습니다.
- 조금 더 자세히 설명드리자면 해당 코드를 통해 발생되는 결과물이 튜플이고 첫번째는 인스턴스 그리고 두번째가 토큰이 러턴값으로 나오는 것 입니다. 그렇기에 두번째 것을 쓰라고 이야기 하는 것 입니다.
- 다음은 해당 오류를 해결하는 코드를 직접 쓴 댓글 입니다.
-그러면 저도 직접 코드 내에 적용하도록 하겠습니다.
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
|
// /leadmanager/account/api.py
from rest_framework import generics, permissions
from rest_framework.response import Response
from knox.models import AuthToken
from .serializers import UserSerializer, RegisterSerializser
# Register API
class RegisterAPI(generics.GenericAPIView)
serializer_class = RegisterSerializer
## kwargs basically means it can take more arguments
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
return Response({
"user": UserSerializer(user,
context=self.get_serializer_context()).data,
"token": AuthToken.objects.create(user)[1]
})
# Login API
# Get User API
|
cs |
- 그 동안의 설명들과 같이 코드를 재정비 하였습니다.
- 지금은 먼저 학습 내용을 작성하는 것 이니 실제 적용은 그 뒤에 하도록 합니다.
- 어쨌거나 Postamn 에서 발생 확인된 Token은 위의 user와 token 코드에 의해 발생된 것 입니다.
- 다음은 로그인 구현하기 입니다.
- 너무 길어지는 느낌이 있군요!
- 다음 포스팅은
(5.3) 장고 토큰 인증 - 로그인 구현하기 로 뵐게요!
잠시 뒤에 봐욤!!! 아스팔트 한판만 하고 올게요!!