서버시나리오를 생각 했을 때 빠질 수 없는 것이 회원가입, 로그인, 로그아웃 시나리오 이다. 한번만 구현을 해본 경험이 있으면 앞으로 꾸준히 쓸 수 있을 것 같아서 정리를 해두려고 한다.
로그인을 관리하기 위해서는 Django 에서 제공하는 Django-rest-auth 라는 패키지를 이용하여 구현을 한다. 클릭 하셔서 Docs 를 보고 직접 구현을 하셔도 되고 내가 실습한 예제를 보셔도 된다.
1. Django-rest-auth 설치
아래의 패키지를 나의 가상환경에 설치해준다.
$ pip install django-rest-auth
2. Setting.py 에 rest_auth 추가
Setting.py 에 rest_auth 를 추가해준다. rest_framework.authtoken 을 같이 설치해준다. Doc에 보면 rest_auth Project 는 django-rest-framework libary 에 dependency 가 있으므로 rest_framework 을 꼭 설치 하라고 가이드 되어 있다. rest_framework 에 대한 예제는 https://freekim.tistory.com/4 에 나와 있다. 참고 하시길.
settings.py
INSTALLED_APPS = [
...,
'rest_framework',
'rest_framework.authtoken',
'rest_auth',
...,
]
참고) rest_framework 이 설치가 안되어 있는경우
pip install djangorestframework
3. rest_auth 의 url 을 추가
urls.py
urlpatterns = [
...
url(r'^rest-auth/', include('rest_auth.urls')),
...
]
4. Database 에 migration 하기
url 까지 추가가 끝났으면 database 에 migrate 해준다.
$ python manage.py migrate
명령어를 python 명령어를 실행하면 아래의 화면을 볼 수 있다.
5. Registration
registration 을 해주기 위해서 setting.py 에 아래의 앱들을 추가해 준다. 이 때 social 의 Authentication 을 추가할 수 있으나 이건 나중에 해보기로 하자. 그리고 SITE_ID = 1 도 추가해준다. allauth app이 설치가 안되어 있다면 설치해주자.
pip install django-allauth
Setting.py
INSTALLED_APPS = [
...
'django.contrib.sites',
'allauth',
'allauth.account',
'rest_auth.registration',
]
SITE_ID = 1
url 도 추가해주자
urls.py
urlpatterns = [
...,
url(r'^rest-auth/', include('rest_auth.urls')),
url(r'^rest-auth/registration/', include('rest_auth.registration.urls'))
]
Setting 에 아래의 configuration 값을 넣어주면 jwt 를 활성화 해줄 수 있는데, 아직 JWT 를 학습하지 않아 나중에 JWT POST 를 작성하면서 더 자세한 설명을 하도록 하겠다.
Docs 를 읽어보면 django-rest-auth 는 Default로 Django’s Token-based authentication이지만 JWT(Json Web Token)로 사용 할 수 있게 해주는 것 같다. 나같은경우는 rest api 로 json 으로 응답을 받으니 JWT 는 다음 포스트에 공부해서 바로 사용 해보아야 겠다.
REST_USE_JWT = True
이제 API 의 EndPoint 를 살펴보자
<< Basic >>
-
/rest-auth/login/ (POST)
- username
- password
Returns Token key
-
/rest-auth/logout/ (POST)
-
/rest-auth/password/reset/ (POST)
-
/rest-auth/password/reset/confirm/ (POST)
- uid
- token
- new_password1
- new_password2
-
/rest-auth/password/change/ (POST)
- new_password1
- new_password2
- old_password
-
/rest-auth/user/ (GET, PUT, PATCH)
- username
- first_name
- last_name
Returns pk, username, email, first_name, last_name
<< Registration >>
-
/rest-auth/registration/ (POST)
- username
- password1
- password2
-
/rest-auth/registration/verify-email/ (POST)
- key
결과 확인
아래의 명령어를 통해 server를 실행 시킨다.
$ python manage.py runserver
1. end point 의 registration 을 먼저 접근해보자. 아래의 페이지를 볼 수 있다.
간단하게 정보를 입력하고 post 를 해보자. (e-mail 은 default로 활성화 되어 있다. 아래와 같이 설정을 바꾸면 변경 가능하다.
ACCOUNT_EMAIL_REQUIRED = False
ACCOUNT_EMAIL_VERIFICATION = 'none'
)
http://localhost:8000/rest-auth/registration/
나같은 경우에는 migrate 이 잘못됫는지 email 이 field 가 없다는 오류가 났었다. allauth 에 뭔가 연관이 있는것 같기도 하고 무튼 다시migrate 을 해주고 실행을 하니 정상 동작 했으나 password 를 너무 짧게 썻었는지 아래의 결과를 얻었다. 기본적으로 비밀번호 길이에 대한 예외처리가 들어가 있나보다. 편하다. 그리고 단순한 password 에 대해서도 예외처리가 되어 있나보다.
비밀 번호를 변경해 준 후 post 를 눌러보니 잘안되는 것 같았지만 등록이 되었다. 등록이 되었다면 로그인을 해보자.
localhost:8000/rest-auth/login 을 하면 아래의 화면을 볼 수 있다.
방금 전 registration 한 정보를 입력 시켜주고 POST 하게 되면
아래의 그림처럼 token값이 넘어오면서 오른쪽 상단에 볼 수 있듯이 내가 입력한 id 로 로그인이 되게 된다.
이 밖에 다른 endpoint 들도 test해보시길 바란다.
'Django' 카테고리의 다른 글
[Django] RestFramework Pagination 예제 (0) | 2019.10.10 |
---|---|
[Django] RestFramework Serializer 댓글 모델 추가하기 (0) | 2019.10.08 |
[Django] RestFramework Image file upload ImageField (0) | 2019.10.04 |
Django ngrok 설정, 홈 서버 (0) | 2019.09.22 |
Django REST framework 예제 (1) | 2019.09.21 |