티스토리 뷰

728x90
반응형

[1] DRF가 지원해주는 Authentication 종류 


Django Rest Framework - Authentication 을 보면 

이렇게 네가지의 Authentication을 지원해주고 있습니다. 

 

 

Basic은 username이랑 password로 인증하는데 테스트에서만 적절하다라고 나와있고 

 

 

Token은 token으로 인증하는데, 클라이언트 - 서버 setup에 적절하다고 하고 (저는 이거 쓰겠습니다..!) 

 

 

Session은 AJAX client(뭔지모름ㅠㅠ)에게 적절하다고 하고 

 

 

Remote는 무슨 말인지 모르겠어요ㅠㅠ

 

 

[2] TokenAuthentication 설치하기

 

이미 rest_framework 패키지를 설치했으니까 

settigs.py에 가서 앱만 추가해주면 됩니다. 

 

 

 

그리고 아래 명령어를 해줍니다. 

python manage.py migrate

 

여기보면 저 명령어를 하면 rest_framework.authtoken이 DB 마이그레이션을 할꺼다~~ 라고 하네요 

 

돌려보면 이렇게 나옵니다. 

 

 

[3] 장고의 User 모델 확장하기 

 

그리고 이런식으로 토큰을 만들 수 있는데 

create할때 들어가는 user는 장고에 기본적으로 있는 User모델이라고 합니다. 

 

 

저는 이렇게 User 모델을 기존에 따로 만들어줬어가지구,, 

 

 

장고 User모델을 확장하는 모델로 바꿀게요!!

여러가지 User모델 확장 방법이 있는데요  (참고:  User 모델의 확장 기법 비교 / django login 유저 확장 방법 )

 

 

기존 User 모델과 OneToOneField로 일대일관계를 맺는 Django 모델을 추가해서 사용자에 관한 정보를 저장하는 방법을 선택했습니다...!!! 
(Django의 인증 시스템을 그대로 활용 & 커스텀 사용자 정보 필드를 저장하고자 할 때 사용하는 기법입니다)

 

이렇게 Profile모델을 만들어줬습니다. 

 

 

마이그레이션도 진행해줍니다. 

 

python manage.py makemigrations
python manage.py migrate

 

 

[4] 회원가입 API 만들기

아래처럼 Signup뷰를 하나 만들어줍니다. 

장고의 User 모델에서는 username이 필수 & 유니크한 값으로 id같은 것이랍니다. 

 

 

 

 

urls.py에 urlpatterns를 추가해주는 것도 잊지 마세요-!!

 

 

저는 account라는 앱을 만들고 여기서 작업해줘서

localhost:8000/account/signup/ 이라는 url로 접속하면 회원가입이 진행되게 됩니다. 

 

 

이렇게 회원가입 api를 부르면 Token을 잘 내려주는 것을 확인했습니다!+!

 

 

 

그리고 admin페이지에 들어가볼게요 

저도 자주 깜박하는데 admin.py에 모델을 등록해야지 해당 테이블이 admin 홈페이지에서 보인답니다!+! 

 

 

우선 User 테이블을 보면 

슈퍼유저인 저와 

제가 방금추가한 jordy와 pooh가 잘들어가있고 

 

 

Tokens에 가보면 

각 사용자마다 토큰 발급된게 있고 

 

 

Profiles에도 죠르디랑 푸가 잘들어가있네요

 

 

 

[5] API요청이 오면 토큰을 보고 유저가 누군지 식별하기 

 

이것도 DRF에서 제공해주는 데요,

 

 

클라이언트에서 HTTPHeader에 다음과 같이

Authorization: Token 토큰값 

 

을 보내주면 request.user (장고의 User인스턴스) 또는 request.auth (Token인스턴스) 로 사용자를 식별할 수 있어요-!

 

 

 

우선 프로젝트의 settings.py에 가셔서 DRF의 인증방법 중 어떤 것을 쓰는지 글로벌하게 명시해줘야해요

 

 

 

저는 installed_app 밑에 추가하였어요-!

 

 

그 다음에 

옛날에 만들어둔 APIView에 가서 

request.user 랑

request.auth를 프린트해볼게요-!! 

 

 

그리고 아까 회원가입할때 얻었던 토큰을 header에 넣어주면 

 

 

 

request.user에 pooh라고 잘나오네요

토큰도 잘나옵니다!

 

 

 

이제 죠르디 토큰으로 요청 해볼게요

 

 

 

 

 

 

request.user로 사용자를 식별해서

사용자에게 맞는 데이터를 내려주면 되겠네요-!!

 

 

 

[6] 로그인 api도 구현해주기 

 

SignupView 밑에 LoginView를 만들어주었습니다.

장고 User모델의 password가 자동으로 암호화되어서 DB에 저장되기때문에

Using the Django authentication system  문서에 나오는 authenticate 메소드를 사용하여 User를 찾아야해요-! 

 

 

 

 

urlpattern도 추가했습니다. 

(참고로 as_view 굳이 안해도 되는데 이거 해야지 디버깅할때 더 자세한 정보가 나오더라구요,,)

 

로그인할때도 토큰주도록 했습니다,,! 

 

 

 

 

www.django-rest-framework.org/api-guide/exceptions/#exception-handling-in-rest-framework-views 
예외처리 문서가 어려워서 자세한 예외처리는 아직 못했습니다ㅠㅠ

 

 

 

 

 

 

궁금쓰

장고는 Password를 암호화해서 DB에 저장하기때문에

내가 admin이라고 해도 내 비밀번호조차도 스스로 볼 수 없다!!

 

 

근데 Token은 암호화안하고 바로 저장하고 보여준다. 

Token은 암호화안해도 되는걸까,,?! 그리고 admin이 전체 사용자의 토큰을 모두 볼 수 있어도 되는걸까,,?!

 

 

 

Reference

yonghyunlee.gitlab.io/python/user-extend/

 

django login 유저 확장 방법 - 김땡땡's blog

장고의 auth 기능은 User 객체를 제공한다. 우리는 기본 default로 이 User 객체로 여러 인증을 구현할 수 있다. User model User model의 기본적으로 있는 여러 필드들이 있다. username 필수사항이다. 150자 이�

yonghyunlee.gitlab.io

 

 

www.django-rest-framework.org/api-guide/authentication/

 

Authentication - Django REST framework

 

www.django-rest-framework.org

 

반응형
댓글