Django REST Framework - Authentication을 보면 다음과 같이 4가지 종류의 Authentiocation을 지원해주고 있습니다.
아이디와 패스워드만을 이용해 기본 인증을 진행합니다. 이러한 인증은 테스트 시에만 적합하다 나와있습니다.
request.user
= Django의User
instance
request.auth
=None
토큰 기반의 인증을 진행합니다. 이러한 인증은 client-server
설정에 적합하다 나와있습니다.
request.user
= Django의User
instance
request.auth
=rest_framework.authtoken.models.Token
ex). 1f36160223463a1fcbd899dc7306d5edcd8a1134
저는 토큰 기반 인증 방식을 사용할 것이므로 기본적인 사용 환경 갖추는 방법을 설명해 드리겠습니다.
📃 setting.py
INSTALLED_APPS = [
.
.
.
'rest_framework.authtoken'
]
python manage.py migrate
일단 다음과 같이 모델을 만들어주었다.
class Profile(models.Model):
user = models.CharField(User, unique=True, max_length=15, null=True)
password = models.CharField(max_length=30, null=True)
nickname = models.TextField(null=True)
def __str__(self):
return self.nickname
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authtoken.models import Token
from django.contrib.auth.models import User
from .models import Profile
class SignupView(APIView):
def post(self, request):
user = User.objects.create_user(username=request.data['id'], password=request.data['password'])
profile = Profile(user=user, nickname=request.data['nickname'])
user.save()
profile.save()
token = Token.objects.create(user=user)
return Response({"Token": token.key})
from django.urls import path
from . import views
urlpatterns = [
path('signup/', views.SignupView.as_view()),
]
여기까지 진행했으면 http://127.0.0.1:8000/signup/
로 테스트를 진행해보면 된다.
이렇게 회원가입 API를 부르면 Token이 잘 나오는 것을 확인할 수 있습니다.
우선 admin 페이지에서 사용하려면 admin.py
에 model을 등록해주어야 한다.
📃 admin.py
from django.contrib import admin
from . import models
# Register your models here.
admin.site.register(models.Profile)
그러고 http://127.0.0.1:8000/admin
으로 들어가 확인하면 다음과 같이 값이 잘 들어와있는 것을 볼 수 있다.
Token.objects.get(key='조건')
로 조회하게 되면 반환되는 값은 조건에 해당하는 키 값이 반환된다.
여기서 Token.objects.get(key='조건').user
를 하게 되면 User 테이블을 참조할 수 있게 되고 그 안의 값들도 자유롭게 사용이 가능하다.
기본값이 원래 설정되어 있는 거 같은데 우리가 바꿀수도 있다. 다음과 같이 변경해주면 설정을 변경할 수 있다.
📃 settings.py
AUTH_USER_MODEL = '기본으로 설정하고 싶은 테이블'
근데 궁금한 점이 이게 어떤식으로 연결되는지 이해를 못하겠다. AUTH_USER_MODEL
로 지정한 테이블만 연동이 되는 것인지 Foreign Key
로 연결되어 있으면 모두 참조 가능한건지 확실하게 모르겠다.
왜냐면 현재 settings에서 설정한 이름 외 모델끼리 연결되어 있으면 참조가 가능하기는 하기 때문이다. 다만 모델 내 필드에 접근은 되지 않는 상황이고 흠.. 따라서 내가 내린 결론은 다음과 같다.
settings에서 설정한 AUTH_USER_MODEL의 model과 연결이 되고, 연결된 모델은 직접 참조가 가능하다.
Token.objects.get(조건)에 해당하는 반환 값이 어떤 형태로 나오는지가 궁금했다. token 정보로만 반환되던 부분을 달리할 순 없을까 해 찾아봤던 부분이다.
우선 Token과 User(ex) 필드: name, mdn)라는 두 개의 모델이 존재할 때, Token.objects.get(조건)을 하게되면 User에서 str 메소드로 설정한 값이 출력되게 되는 것을 확인할 수 있었습니다.
결론은 Token과 연결되어 있는 User model의 __str__ 값에 의해 값을 유동적으로 변경할 수 있다!