DRF 05 Auth

Seungju Hwang·2020년 12월 18일
0

django

목록 보기
9/11
post-thumbnail

Intro

[dj-rest-auth](https://dj-rest-auth.readthedocs.io/en/latest/introduction.html)라이브러리를 활용하여 RESTful API 기반의 사용자 등록 및 인증 작업을 처리해봅시다

RESTful API 기반 (DRF에서) 의 사용자 등록 및 인증 작업을 위해선 토큰이 필요합니다. 왜냐면 REST의 특징으로 Stateless가 있잖아요. 사용자 인증에 대한 정보를 가지고 있지 않으니까 이걸 보관해뒀다가 서버와 대화할 때 꾸준히 보여줘야해요. 그래서 토큰이 필요합니다. 그럼 이 토큰이 일반토큰(dj-rest-auth)이냐 JWT냐에 따라 달라집니다. (이건 차후에 다시 설명할게요)

참고로 유저는 이 토큰을 쿠키, 로컬 스토리지, 세션 스토리지 중 한 곳에 저장합니다. (요즘은 로컬이나 세션 스토리지를 더 활용하는 편입니다)

  • 세션 : 로그인이 지속되는 상태 또는 그 관련 데이터

🔵 Setting

패키지 설치부터 하자!

$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 사용법을 익혀봅시다!

Serializer 정의

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',)

Url 경로 설정

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),

]

Signup (POST)

회원가입을 함으로써 토큰을 만들어봅시다!

  • 회원가입과 동시에 로그인이 진행되어 토큰이 발행되었습니다!

Login (POST)

로그인해봅시다!

Artist List (GET & CREATE) ⭐

아티스트 리스트를 받아오고, 아티스트를 생성해봐요!

1.Token Header에 담기 2.권한 부여 에 대한 기초적인 정보를 아래 에서 설명하겠습니다.

  1. view

@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 사용

  1. output
  • GET

  • POST

    로그인 시 받은 토큰을 Headers에 올려서 함께 보내야 합니다.

    형식 → Authorization : Token yourToken

Artist Detail (GET)

아티스트 디테일을 볼 수 있어요.

→ 이것도 로그인 안해도 볼 수 있게 만들어요

  1. view
@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)
  1. output

Music (POST)

노래를 생성해봅시다!

  1. view

로그인한 사람만 노래를 생성할 수 있어요

@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)
  1. output

Header 에 토큰 넣어주세요 형식 → Authorization : Token yourToken



더 이상의 설명은 반복되는 부분이므로 생략!

📚 참고문서

djangorestframework 공식문서
dj-rest-auth 공식문서

profile
기록하는 습관은 쉽게 무너지지 않아요.

0개의 댓글