[dj-rest-auth](https://dj-rest-auth.readthedocs.io/en/latest/introduction.html)
라이브러리를 활용하여 RESTful API 기반의 사용자 등록 및 인증 작업을 처리해봅시다
RESTful API 기반 (DRF에서) 의 사용자 등록 및 인증 작업을 위해선 토큰이 필요합니다. 왜냐면 REST의 특징으로 Stateless가 있잖아요. 사용자 인증에 대한 정보를 가지고 있지 않으니까 이걸 보관해뒀다가 서버와 대화할 때 꾸준히 보여줘야해요. 그래서 토큰이 필요합니다. 그럼 이 토큰이 일반토큰(dj-rest-auth)이냐 JWT냐에 따라 달라집니다. (이건 차후에 다시 설명할게요)
참고로 유저는 이 토큰을 쿠키, 로컬 스토리지, 세션 스토리지 중 한 곳에 저장합니다. (요즘은 로컬이나 세션 스토리지를 더 활용하는 편입니다)
$pip install dj-rest-auth django-allauth
# ./api/settings.py
INSTALLED_APP = [
#djangorestframework
'rest_framework',
#1️⃣
'dj_rest_auth'
'rest_framework.authtoken',
#2️⃣
'django.contrib.sites', # 장고 내부의 패키지인데, 복수의 DB 활용하기 위해 필요
'allauth',
'allauth.account',
'allauth.socialaccount',
'dj_rest_auth.registration',
]
#2️⃣
SITE_ID=1
#1️⃣
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
]
}
# ./api/urls.py
urlpatterns = [
#1️⃣
path('dj-rest-auth/', include('dj_rest_auth.urls')),
#2️⃣
path('dj-rest-auth/registration/', include('dj_rest_auth.registration.urls')),
]
$python manage.py migrate
1️⃣ : dj-rest-auth 패키지를 다운로드 받은 후 세팅해야 할 것 유저인증을 위해 필요함
2️⃣ : allauth 패키지를 다운로드 받은 후 세팅해햐 할 것 유저등록을 위해 필요함
최소한으로 music 앱을 제공하는 api 서버를 만들어 dj-rest-auth 사용법을 익혀봅시다!
from rest_framework import serializers
from .models import Artist,Music
#여기 필드에 작성하는 것들은 유효성 검사를 할 지 안할 지 결정하는 곳이에요.
class ArtistListSerializer(serializers.ModelSerializer):
class Meta:
model = Artist
fields = ('id','name',)
class MusicSerializer(serializers.ModelSerializer):
class Meta:
model = Music
fields = ('id','title','artist',)
read_only_fields=('artist',)
class ArtistSerializer(serializers.ModelSerializer):
music_set = MusicSerializer(many=True, read_only=True)
music_count = serializers.IntegerField(source='music_set.count',read_only=True)
class Meta:
model = Artist
fields = ('id','name','music_set','music_count',)
class MusicListSerializer(serializers.ModelSerializer):
class Meta:
model = Music
fields = ('id','title',)
from django.urls import path
from . import views
urlpatterns = [
# 아티스트 리스트 READ, 아티스트 CREATE
path('artist/',views.artist_list),
# 아티스트 디테일 READ
path('artist/<int:artist_pk>/',views.artist_detail),
# 노래 CREATE
path('artist/<int:artist_pk>/music/',views.artist_music),
# 노래 리스트 READ
path('music/',views.music_list),
# 노래 디테일 READ, UPDATE, DELETE
path('music/<int:music_pk>/',views.music_detail),
]
회원가입을 함으로써 토큰을 만들어봅시다!
로그인해봅시다!
아티스트 리스트를 받아오고, 아티스트를 생성해봐요!
1.Token Header에 담기 2.권한 부여 에 대한 기초적인 정보를 아래 에서 설명하겠습니다.
@permission_classes([ API Reference ])
데코레이터를 사용함으로써, 접근 권한을 따질 수 있습니다. API Reference 에 들어갈수 있는 것들은
IsAuthenticated
: 로그인한 사람만
IsAuthenticatedOrReadOnly
: 모두가 READ는 가능. 로그인한 사람은 CREATE까지 가능
등이 있습니다.
from django.shortcuts import render
# Create your views here.
from django.shortcuts import get_object_or_404
from .models import Artist,Music
from .serializers import (
ArtistListSerializer,
ArtistSerializer,
MusicListSerializer,
MusicSerializer
)
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
#로그인을 위한 것
# Token login을 위한 import
from rest_framework.decorators import permission_classes
from rest_framework.permissions import IsAuthenticated,IsAuthenticatedOrReadOnly
@api_view(['GET','POST'])
@permission_classes([IsAuthenticatedOrReadOnly])
def artist_list(request):
'''
GET /api/v1/artist/
POST /api/v1/artist/
'''
if request.method =='GET':
artists = Artist.objects.all()
serializer = ArtistListSerializer(artists,many=True)
return Response(data=serializer.data)
if request.method =='POST':
serializer = ArtistListSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(data=serializer.data)
→ 아티스트 리스트를 읽는건 누구나 할 수 있으나 아티스트 작성은 로그인한 사람만 가능하도록 IsAuthenticatedOrReadOnly
사용
GET
POST
로그인 시 받은 토큰을 Headers에 올려서 함께 보내야 합니다.
형식 → Authorization : Token yourToken
아티스트 디테일을 볼 수 있어요.
→ 이것도 로그인 안해도 볼 수 있게 만들어요
@api_view(['GET'])
@permission_classes([IsAuthenticatedOrReadOnly])
def artist_detail(request,artist_pk):
'''
GET /api/v1/artist/<int:artist_pk>/
'''
artist = get_object_or_404(Artist,pk=artist_pk)
serializer = ArtistSerializer(artist)
return Response(serializer.data)
노래를 생성해봅시다!
로그인한 사람만 노래를 생성할 수 있어요
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def artist_music(request,artist_pk):
'''
POST /api/v1/artist/<int:artist_pk>/music/
'''
artist = get_object_or_404(Artist,pk=artist_pk)
serializer = MusicSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save(artist=artist)
return Response(serializer.data,status=status.HTTP_201_CREATED)
Header 에 토큰 넣어주세요 형식 → Authorization : Token yourToken
더 이상의 설명은 반복되는 부분이므로 생략!