티스토리 뷰
서론
일반 요청 헤더의 Authorization으로 Token을 사용하는 로그인을 구현하는 방법입니다.
본론
기본 설정
당연하지만 djangorestframewok를 설치해야 합니다.
pip install djangorestframework
settings.py
INSTALLED_APPS에 다음 앱들을 추가해줍시다.
#settings.py
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework.authtoken',
...
]
이제 settings.py 파일 내에 REST_FRAMEWORK 딕셔너리를 만들고 토큰 인증 방법을 추가해 줍니다.
#settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
]
}
DB 마이그레이션
이후 토큰 인증을 위해 데이터베이스를 마이그레이트 해줍니다.
python manage.py makemigrations
python manage.py migrate
인증 요구 뷰 만들기
restframework의 permissions를 이용해 토큰 인증시에만 가능하도록 구현해보겠습니다.
아래는 간단한 ViewSet에 IsAuthenticated 를 부여하여 인증을 요구하도록 하였습니다.
#accounts/serializers.py
from django.contrib.auth import get_user_model
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = ['id', 'username']
#accounts/views.py
from django.contrib.auth import get_user_model
from accounts.serializers import UserSerializer
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated
class UserViewSet(viewsets.ModelViewSet):
queryset = get_user_model().objects.all()
serializer_class = UserSerializer
permission_classes = [IsAuthenticated]
만들어진 viewset은 router를 이용해 쉽게 url에 연결할 수 있습니다. token을 발급받기 위해서 restframewokr에서 기본으로 제공하는 Obtain_auth_token 뷰를 이용합니다.
#urls.py
from django.urls import path, include
from rest_framework import routers
from rest_framework.authtoken import views
from accounts.views import UserViewSet
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
urlpatterns = [
path('api/', include(router.urls)),
path('api/token/, views.obtain_auth_token)
]
결과
http://ORIGIN/api/token 주소로 username과 password를 보내 token을 발급 받습니다.
//request body
{
username: "your-username"
password: "your-password"
}
//response body
{
token: "wkfrkdysothwndgkstkfkagodqhrgoTdjdy"
}
발급받은 토큰을 Postman이나 curl과 같은 도구를 이용해 headers에 "Authorization: Token wkfrkdysothwndgkstkfkagodqhrgoTdjdy" 같은 형식으로 넣어줍니다.

authorization을 넣지 않았을 때 자격인증 미달이 발생합니다.
토큰 값을 넣으면 정상적으로 확인되는 것을 알수 있습니다.
결론
백엔드 세상은 멀고도 험한 것 같습니다.
'개발자 > 파이썬(Python)' 카테고리의 다른 글
| [Django] 특정 쿼리셋만 Serialize하기 (0) | 2024.02.29 |
|---|---|
| [Django] ViewSet에서 action마다 다른 permission 적용하기 (0) | 2024.02.20 |
| [Python] Re 패키지로 정규표현식 사용하기 (0) | 2024.02.03 |
| [Django] Docker 배포 시 CSRF 검증에 실패했습니다. 해결방법 (0) | 2024.01.22 |
| [Django] 조건부 CBV 만들기 (0) | 2024.01.19 |
