인증(Authentication)과 허가(Permission)가 무엇인지 권한관리에 대해서 배우고 있다.
인증:어떤 서비스를 이용하는데에 있어 내가 어느 정도의 권한을 요청하는 과정
허가:서비스를 어느정도로 이용할수 있는지에 대한 권한
지난포스팅에서 인증 공식문서와 실습을 봤고. 그러다 TokenAuthentication과 JWTAuthentication에 대해서 더욱 이해가 필요할것 같아서 따로 기록해두려한다.
우선 rest_framework.authentication의 내장 인증 방법인
TokenAuthentication
default authentication의 단점들! 보안이 취약한 BasicAuthentication, 외부 서버에서 사용불가능한SessionAuthentication의 한계때문에 많은 서비스에서 Token인증을 사용한다. Mobile Client에 적합하다.
User별로 고유 token을 생성하고 이것을 토대로 인증한다.
[Token Authentication 수행과정]
1.username,password와 1:1 매칭되는 고유 key(토큰) 생성,발급
(User instance의 생성에 따라 자동으로 생성되는것은 아니다)
2. 발급받은 token을 API요청에 담아 인증처리
[실습과정]
Token받을 준비
1.다른 authentication과 다르게 settings py(전역)나 views py(개별)에 작성 후
2.authtoken을 settings py에 작성하고 migrate까지 해줘야한다.
$python manage.py migrate
rest_framework.authtoken앱이 Django DB에 migration을 제공한다.
토큰은 User별로 1:1 매칭되는 것이므로 migrate를 하는 것!
이렇게 했으면 이제 토큰을 발급받을 준비가 완료된 것이다.
이제, Token을 발급하는 방법
(1)api endpoint를 노출시키는 방법- rest_framework.authtoken.views의 obtain_auth_token을 이용한 생성
클라이언트가 ID,PWD제출하면 자동으로 토큰이 생기도록 하는 방법
url에 다음과 같이 obtain_auth_token을 추가하는 방법
유효한 ID,PWD가 입력됐다면 JSON형태의 토큰이 리턴된다.
default로 설정되어 있는방법이지만 내용은 아래와 같다.
(2)Python명령어를 통한 생성
$python manage.py drf_create_token <username> #반복해도 같은 username이면 같은 토큰 나온다.
$python manage.py drf_create_token -r <username> #강제로 재발급할때
(3)자동으로 토큰이 생성되길 원한다면 - signals를 이용한 방법
어떤 모델이 저장될 때마다 호출되는 함수(django의 signal의 post_save)를 이용해 어떤 모델에 저장될 떄마다 user별로 저장되도록 이렇게 models.py의 모듈이나 Django가 시작하는 곳에 작성할 수 있다.
receiver라는 데코레이터와 signals의 postsave를 이용한것
이미 User들이 존재한다면 아래코드를 수행하면 된다.
+)JS의 eventhandler처럼 django에서 특정 동작이 수행됐을 때 처리될 동작을 지정할 수 있는 signals가 있다.
이 중 post_save는 DB에 뭔가가 저장된 직후에 특정 동작 수행
#DB에 새 유저가 저장될때 마다 settings.py의 AUTH_USER_MODEL에 의해 signals를 보내는것
#그 signals은 create_auth_token에 정의되어 있다
(Token.objects.create에서 user에 1:1매칭되는 토큰을 하나 만들어서 AUTH_USER_MODEL에 보내준다는 뜻)
생성된 Token의 획득
token을 획들 할 수 있는 url에 post요청을 통해서 가능하다.
settings.py의 installed_app에 설치한
rest_framework.authtoken.views안에 있는 obtain_auth_token이 있는데 여기에 .as_view()를 붙인것
그리고 이를 urlpath에 등록하기
*obtain_auth_token은 post요청만 받는다.
이렇게 발급받은 Token을 API요청에 담아 인증처리하는것인데 인증 성공시
request.user와 request.auth에는 위와 같은 값이 담긴다.
실습하기
Token받을 준비
1.settings py에 installed apps에 authtoken등록하기
이 authtoken의 onetoone의 모델필드를 바탕으로 토큰을 발급할것이므로
2.$python managepy migrate
3.
전역으로 설정하려면 settingspy에 작성하거나.
개별로 view에 authentication_classes를 TokenAuthentication이라 지정한다.
여기선 개별 view에 대해 작성하였다.
Token을 생성하기
4.$python managepy drf_create_token <유저이름>
몇번 반복해도 같은 토큰 나온다. 다른 토큰만들려면 -r옵션으로 가능!
5.이런식으로 발급한 토큰에 대해서 획득하기위해
프로젝트폴더의 urlspy에
from rest_framework.authtoken.views import obtain_auth_token
path('api-token-auth/',obtain_auth_token),
urlpatterns에 추가하기
저 url에 post요청으로 username과 password를 보내면 username에 맡는 token이 나온다
6.
토큰을 갖고 사용하기 위해 HTTP요청에 'Authorization: Token <토큰>'을 같이 실어보낸다
같이 안보낸다면 401 Unauthorized error가 뜨겠지머
-끝-
담엔 JSONWebTokenAuthentication을 알아볼 것이다.
www.django-rest-framework.org/api-guide/authentication/#tokenauthentication
github.com/LikeLionSCH/LikeLion_Django_Study_Summary/tree/master/14_TokenAuthentication
'[Python,Django]' 카테고리의 다른 글
[Unity] 웹 연동하기 (0) | 2020.08.05 |
---|---|
Python 파이썬 기초 문법2 for 알고리즘 (0) | 2020.05.11 |
Django Rest Framework 3. view of DRF (0) | 2020.03.17 |
Django Rest Framework 2.실습-Serializer,ViewSets (0) | 2020.03.16 |
Django Rest Framework 1.이론2 (0) | 2020.03.14 |