DRF 11 - Django REST Auth

Joey Lee·2020년 7월 13일
3

Django REST Framework

목록 보기
12/16

장고 DRF에서 회원가입, 로그인 기능을 제공해주는 라이브러리는 django-rest-auth이다.

이번 장에서는 django-rest-auth를 이용해서 로그인과 회원가입 기능을 구현하는 과정을 살펴보도록 하겠다.

1. 로그인 기능 위한 Setting

1) django-rest-auth 설치

pip install django-rest-auth

2) settings.py 수정

우선, Session Authentication과 Token Authentication 이용을 위해서 관련 내용을 추가해 준다.

이와 관련해 보다 심층적인 내용은 DRF Authentication 공식문서 링크를 참고하면 된다.

[settings.py]

INSTALLED_APPS = [
    'rest_framework.authtoken' # authtoken 추가
    
    'rest_auth',   # rest_auth 추가

]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',

    ]
}

2) 프로젝트 내 urls.py 내용 추가

urlpatterns = [
    path('api-auth/', include("rest_framework.urls")),
    path('api/rest-auth/', include("rest_auth.urls")),
]

3) migrate

auth, authtoken 등 관련 모델 생성을 위해 migrate을 해 준다.

> python manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, authtoken, contenttypes, profiles, sessions
Running migrations:
  Applying authtoken.0001_initial... OK
  Applying authtoken.0002_auto_20160226_1747... OK

이제 어드민에 가 보면 token을 추가할 수 있게 된 것 확인할 수 있다.

2. 로그인 기능 구현

api 폴더를 생성해서 serializers.py, urls.py, views.py을 아래와 같이 작성한다.

[serializers.py]

from rest_framework import serializers
from profiles.models import Profile, ProfileStatus

class ProfileSerialzier(serializers.ModelSerializer):
    user = serializers.StringRelatedField(read_only=True)
    avatar = serializers.ImageField(read_only=True)

    class Meta:
        model = Profile
        fields = "__all__"

class ProfileAvatarSerializer(serializers.ModelSerializer):

    class Meta:
        model = Profile
        fields = ("avatar", )

class ProfileStatusSerializer(serializers.ModelSerializer):
    user_profile = serializers.StringRelatedField(read_only=True)

    class Meta:
        model = Profile
        fields = "__all__"

[urls.py]

from django.urls import path
from profiles.api.views import ProfileList

urlpatterns = [
    path('profiles/', ProfileList.as_view(), name='profile-list')
]

[views.py]

from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
from profiles.models import Profile
from profiles.api.serializers import ProfileStatusSerializer

class  ProfileList(generics.ListAPIView):
    queryset = Profile.objects.all()
    serializer_class = ProfileStatusSerializer
    permission_classes = [IsAuthenticated]

3. 로그인 기능 Test

프로젝트 내에 clients 폴더 생성 후 token-auth-test1.py를 아래와 같이 작성한다.

import requests
import json

def client():
    # credentials = {"username": "admin", "password" : "50rh1754"}

    # response = requests.post("http://127.0.0.1:8000/api/rest-auth/login/", data=credentials)
    
    token_h = "Token 01626436a54d04a37d1eb51ad54bbf0a20f58c98"
    headers = {"Authorization": token_h}

    response = requests.get("http://127.0.0.1:8000/api/profiles", headers=headers)

    print("Status Code:", response.status_code)
    response_data = response.json()
    print(response_data)

if __name__ == "__main__":
    client()

[테스트 진행]

  • 먼저, post로 username, password를 전달 한 후 토큰이 잘 발행되는지 확인한다.
  • 먼저, 토큰 없이 get으로 api에 접근하면 권한이 없다는 메시지가 뜬다. 그 다음 토큰을 headers에 담아서 해당 api에 get 호출을 해서 화면이 잘 뜨는지 확인한다.
  • 여기까지 확인했다면 이제 로그인 기능은 완성된 것이다.

--

4. 회원가입 기능 위한 Setting

1) django-allauth 설치

pip install django-allauth

2) settins.py에 아래 내용 추가

INSTALLED_APPS = [
    # 아래 코드 추가
    'django.contrib.sites',

    'allauth',
    'allauth.account',
    'allauth.socialaccount'

    'rest_auth.registration',
]

...

SITE_ID = 1

ACCOUNT_EMAIL_VERIFICATION = "none"
ACCOUNT_EMAIL_REQUIRED = (True)

3) migrate

> python manage.py migrate

Operations to perform:
  Apply all migrations: account, admin, auth, authtoken, contenttypes, profiles, sessions, sites, socialaccount
Running migrations:
  Applying account.0001_initial... OK
  Applying account.0002_email_max_length... OK
  Applying sites.0001_initial... OK
  Applying sites.0002_alter_domain_unique... OK
  Applying socialaccount.0001_initial... OK
  Applying socialaccount.0002_token_max_lengths... OK
  Applying socialaccount.0003_extra_data_default_dict... OK

4) urls.py 수정

urlpatterns = [
    # 아래 코드 추가
    path('api/rest-auth/registration/', include("rest_auth.registration.urls"))
]

from django.conf.urls.static import static
from django.conf import settings

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

5. 회원가입 기능 Test

프로젝트 내에 clients 폴더 내에 token-auth-test2.py를 아래와 같이 작성한다.

import requests
import json

def client():
    #import pdb; pdb.set_trace() 
    # data = {
    #     "username": "resttest",
    #     "email" : "test@test.com", 
    #     "password1" : "changeme123",
    #     "password2" : "changeme123"
    # }

    # response = requests.post("http://127.0.0.1:8000/api/rest-auth/registration/", data=data)
    
    token_h = "Token 51427559d3e6f00df8ea09a75f7f38b84256761e"
    headers = {"Authorization": token_h}

    response = requests.get("http://127.0.0.1:8000/api/profiles/", headers=headers)

    print("Status Code:", response.status_code)
    response_data = response.json()
    print(response_data)

if __name__ == "__main__":
    client()

[테스트 진행]

  • 먼저, post로 data를 전달하여 계정이 잘 생성되는지 확인한다.
  • 그 이후 /api/profiles/에 접속이 잘 되는지 확인한다.
  • 접속이 잘 되었다면 회원가입 기능은 잘 구현이 된 것이다.
profile
안녕하세요!

0개의 댓글