BasicAuthentication
: ๋ณด์์ด ์ทจ์ฝํ ์ ์๋ค.
SessionAuthentication
: ์ธ๋ถ ์๋น์ค์์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ ํ๋ค.
๋ฐ๋ผ์ TokenAuthentication
์ ๋ง์ด ์ฌ์ฉํ๋ฉฐ Mobile Client์ ์ ํฉํ๋ค.
- username, password์ 1:1 ๋งค์นญ๋๋ ๊ณ ์ key ์์ฑ, ๋ฐ๊ธ
- ๋ฐ๊ธ๋ฐ์
Token
์ API์์ฒญ์ ๋ด์ ์ธ์ฆ์ฒ๋ฆฌ
๊ธฐ์กด์ ์ธ์ฆ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ํ๋์ ๋จ๊ณ๋ฅผ ๋ ๊ฑฐ์ณ์ผํ๋ค.
settings.py
์ INSTALLED_APPS
์ ์๋์ ๊ฐ์ด
rest_framework.authtoken
์ ์ถ๊ฐํ๊ณ migrate
๋ช
๋ น์ด๋ฅผ ์คํํด ์ฃผ์ด์ผ ํ๋ค.
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework.authtoken',
...
]
migrate
๋ช
๋ น์ด๋ฅผ ์คํ์ํค๋ ๊ฒ์ผ๋ก ๋ณด์ ๋ชจ๋ธ๊ณผ ์ฐ๊ด์ด ์๋ค.
rest_framework
๋ด๋ถ์ authtoken
์ฑ์ models.py
์ ์๋ Token
ํด๋์ค๋ค.
OneToOneField
๋ฅผ ์ด์ฉํด ํ๋์ ์ฌ์ฉ์์ ํ๋์ Token
์ ๋ฐ๊ธํ๋ค.
class Token(models.Model):
"""
The default authorization token model.
"""
key = models.CharField(_("Key"), max_length=40, primary_key=True)
user = models.OneToOneField(
settings.AUTH_USER_MODEL, related_name='auth_token',
on_delete=models.CASCADE, verbose_name=_("User")
)
created = models.DateTimeField(_("Created"), auto_now_add=True)
User Instance
๋ฅผ ์์ฑํ๋ฉด Token
์ด ์๋์ผ๋ก ์์ฑ๋๋ ๊ฒ์ ์๋๋ค.
authtoken
์ฑ์views.py
์ObtainAuthToken
์ ์ด์ฉํด ์์ฑ
ObtainAuthToken
์ ์ฝ๋๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์๋ค.
Python
๋ช ๋ น์ด๋ฅผ ํตํ ์์ฑ
ํ ํฐ ์์ฑํ๊ธฐ
python manage.py drf_create_token <username>
ํ ํฐ ๊ฐ์ ๋ก ์ฌ์์ฑํ๊ธฐ
python manage.py drf_create_token -r <username>
signal
์ ์ด์ฉํ ์ฌ์ฉ์ ์์ฑ์Token
์์ฑ
signal
์ ํน์ ๋์์ด ๋ฐ์ํ์ ๋ ์ฒ๋ฆฌ๋ ๋์์ ์ง์ ํ ์ ์๋๋ก ํ๋ค.
์๋์์ ์ฌ์ฉํ post_save
๋ DB์ ์ ๋ณด๊ฐ ์ ์ฅ๋ ์งํ์ ํน์ ๋์์ด ์ํ๋๋ค.
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
์ ์ฌ์ฉ์๊ฐ ์์ฑ๋ ๋ ๋ง๋ค settings.AUTH_USER_MODEL
๋ก signal
์ ๋ณด๋ธ๋ค.
user
์ 1:1 ๋งค์นญ๋๋ ํ ํฐ์ ์์ฑํด AUTH_USER_MODEL
๋ก ๋ณด๋ด์ค๋ค.
Token
์ ํ๋ํ ์ ์๋ URL Path
๋ฅผ ์ง์ ํ๊ณ ๊ทธ URL
์ POST
์์ฒญ์ ๋ณด๋ด Token
์ ํ๋ํ๋ค.
obtain_auth_token
์ Token
์ ์์ฑํ ๋ ์ฌ์ฉํ ObtainAuthToken
์ as_view
๋ฅผ ๋ถ์ธ๊ฒ์ด๋ค.
์๋์ ๊ฐ์ด urls.py
์ ์ถ๊ฐํด์ฃผ๊ณ ๊ทธ URL
์ POST
์์ฒญ์ ๋ณด๋ด๋ฉด ๋๋ค.
...
from rest_framework.authtoken.views import obtain_auth_token
urlpatterns = [
path('api-auth/', include(rest_framework.urls)),
path('api-token-auth/', obtain_auth_token),
]
- ์ธ์ฆ ์ฑ๊ณต์
request.user = <Django User Instance>
request.auth = <rest_framework.authtoken.models.BasicToken Instance>
Authentication
, Permission
๊ฐ์์ ์ฌ์ฉํ ํ๋ก์ ํธ์ ๋์ผ
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework.authtoken',
'userpost.apps.UserpostConfig',
]
python manage.py makemigrations
python manage.py migrate
์๋์ ๊ฐ์ด authtoken
๋ชจ๋ธ๋ ์ ์ฉ๋์๋ค.
settings.py
์์ ์ ์ญ์ผ๋ก ์ ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์กด์ฌํ๋ค.
...
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticatedOrReadOnly
class UserPostViewSet(viewsets.ModelViewSet):
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticatedOrReadOnly]
...
python manage.py drf_create_token <username>
์๋์ ๊ฐ์ด Token
์ด ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํ ํฐ์ด ์กด์ฌํ๋ ์ํ์์ ์ฌ์์ฑํ๋ฉด ๋์ผํ ํ ํฐ์ด ๋ฐ๊ธ๋๋ค.
์๋์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ ๋ก ํ ํฐ์ ์ฌ์์ฑํ๋ค.
python manage.py drf_create_token -r <username>
์๋์ ๊ฐ์ด ์ด์ ๊ณผ ๋ค๋ฅธ ํ ํฐ์ด ์ฌ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์๋์ ๊ฐ์ด ํ๋ก์ ํธ ํด๋์ urls.py
์ obatin_auth_token
๋ชจ๋์ ์ถ๊ฐํด ์ฌ์ฉํ๋ค.
obtain_auth_token
์ POST
๋ฐฉ์์ ์์ฒญ๋ง ๋ฐ๋๋ค.
from django.contrib import admin
from django.urls import path, include
from rest_framework.authtoken.views import obtain_auth_token
import userpost.urls
import rest_framework.urls
urlpatterns = [
path('admin/', admin.site.urls),
path('userpost/', include(userpost.urls)),
path('api-auth/', include(rest_framework.urls)),
path('api-token-auth/', obtain_auth_token)
]
POST
๋งค์๋๋ก ์์ฒญ
GET
๋งค์๋๋ก ์์ฒญ
"Authorization: Token <Token>"
์ httpie
๋ช
๋ น์ด์ ์ถ๊ฐํด ์ฌ์ฉํ๋ค.
Request
์Token
์ ์ถ๊ฐํด ๋ณด๋ผ ๊ฒฝ์ฐ
Request
์Token
์ด ์์ ๊ฒฝ์ฐ