[DRF] - Authentication

오동훈·2022년 8월 5일
0

Django

목록 보기
5/23
post-thumbnail
post-custom-banner

1. Authentication 종류

Django REST Framework - Authentication을 보면 다음과 같이 4가지 종류의 Authentiocation을 지원해주고 있습니다.

BasicAuthentication

아이디와 패스워드만을 이용해 기본 인증을 진행합니다. 이러한 인증은 테스트 시에만 적합하다 나와있습니다.

request.user = Django의 User instance
request.auth = None

TokenAuthentication

토큰 기반의 인증을 진행합니다. 이러한 인증은 client-server 설정에 적합하다 나와있습니다.

request.user = Django의 User instance
request.auth = rest_framework.authtoken.models.Token
                       ex). 1f36160223463a1fcbd899dc7306d5edcd8a1134

2. setting

저는 토큰 기반 인증 방식을 사용할 것이므로 기본적인 사용 환경 갖추는 방법을 설명해 드리겠습니다.

1. APP 추가

📃 setting.py

INSTALLED_APPS = [
	.
    .
    .
    'rest_framework.authtoken'
]

2. migrate

python manage.py migrate

3. model 생성

일단 다음과 같이 모델을 만들어주었다.

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

4. 회원가입 API 만들기

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

5. Routing

from django.urls import path
from . import views

urlpatterns = [
    path('signup/', views.SignupView.as_view()),
]

여기까지 진행했으면 http://127.0.0.1:8000/signup/로 테스트를 진행해보면 된다.

6. Test

이렇게 회원가입 API를 부르면 Token이 잘 나오는 것을 확인할 수 있습니다.

7. admin에서 확인

우선 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으로 들어가 확인하면 다음과 같이 값이 잘 들어와있는 것을 볼 수 있다.

3. Etc.

Q1. Token과 User 어디까지 참조 가능한가

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과 연결이 되고, 연결된 모델은 직접 참조가 가능하다.

Q2. Token에 해당하는 값 반환

Token.objects.get(조건)에 해당하는 반환 값이 어떤 형태로 나오는지가 궁금했다. token 정보로만 반환되던 부분을 달리할 순 없을까 해 찾아봤던 부분이다.

우선 Token과 User(ex) 필드: name, mdn)라는 두 개의 모델이 존재할 때, Token.objects.get(조건)을 하게되면 User에서 str 메소드로 설정한 값이 출력되게 되는 것을 확인할 수 있었습니다.

결론은 Token과 연결되어 있는 User model의 __str__ 값에 의해 값을 유동적으로 변경할 수 있다!

profile
삽질의 기록들🐥
post-custom-banner

0개의 댓글