Closed 10cheon00 closed 3 years ago
httpie로 프론트없이 api와 대화하기위해 따로 가상환경을 만들어 requirements를 깔끔하게 다루었다. http -v POST rest-blog.run.goorm.io/api/profiles/ username="" password=""
api주소 끝에 꼭
/
를 넣어주어야 한다!
api 구조변경
backend
|-- articles
`-- profiles
pull request에 앱의 경로를 바꾸면서 해야할 것들 정리했다.
pip install djangorestframework-jwt
global로 사용될 Authentication_classes와 permissions_classes를 설정한다. https://github.com/10cheon00/RESTful-blog/blob/26e034580eb22cb3a98a00ce9df9061854162ed0/blog_project/blog_project/settings/local.py#L14-L21
설정만 해놓으면 viewset또는 view에 설정을 하지 않아도 기본으로 적용된다. https://github.com/10cheon00/RESTful-blog/blob/26e034580eb22cb3a98a00ce9df9061854162ed0/blog_project/backend/articles/views.py#L19-L23 23, 24줄을 보면 뷰셋에 설정한 것을 볼 수 있는데 이렇게 안해도 된다...
예외가 필요한 경우는 어떻게 해야할지 공부하기!
JWT_AUTH설정도 추가해야한다. https://github.com/10cheon00/RESTful-blog/blob/26e034580eb22cb3a98a00ce9df9061854162ed0/blog_project/blog_project/settings/local.py#L23-L30
If JWT_ALLOW_REFRESH is True, issued tokens can be “refreshed” to obtain a new brand token with renewed expiration time.
근데 verify를 사용하지 않았다? 코드 수정해야겠다!
당장 돌아가기 위해 url을 그대로 노출시켜버렸다. api에 username, password를 넣어 요청하면 유저모델에 추가해야한다. 이해되지 않은채로 짜서 지금은 토큰을 받는 코드가 되버렸다. 중요한 것은 axios를 사용할 때 인자를 넣어 요청하는 코드다.
https://github.com/10cheon00/RESTful-blog/blob/26e034580eb22cb3a98a00ce9df9061854162ed0/blog_project/frontend/src/components/Login.vue#L26-L37
로그인에서는 특이하게 localStorage를 사용한다. 개발자 도구를 보면 Application항목에 localStorage가 있다. 그 공간을 활용하는 것!
localStorage.setItem(keyString, item)
으로 저장을 할 수 있다.
반대로 불러오는 방법은 localStorage.getItem(keyString)
이다.
axios에 headers를 추가해 넘기고 있다. 솔직히 headers가 어떤 역할인지는 모르겠다. axios를 더 살펴볼 것! 중요한건 인증이 필요한 api에 이렇게 header로 토큰을 넘기면 인증이 통과된다는 것이다.
먼저 backend라고 지어진 앱을 Articles(블로그)와 Profiles(토큰인증용)으로 나눴다.
djangorestframework-jwt를 설치, profiles에서 활용했다. view와 serializer도 없이 jwt에서 제공하는 메소드를 urls에 박아넣었지만, 커스텀 유저모델이 필요할 때면 다시 수정해야한다.
settings/local.py에서 REST_FRAMEWORK = {}안에 인증과 권한설정을 위해 몇 가지 추가했다. 그런데 이게 모든 상황에 적용되다보니 인증이 필요없는 조회를 위해 접근하려 할 때에도 토큰을 요구하며 401을 반환한다. 왜냐하면 articles의 viewsets에서 authentication_class, permission_class를 통해 인증을 거쳐야만 가능하게 했었다. 뷰셋을 사용해서 간단하게 만들었지만, 인증이 필요한 뷰와 그렇지 않은 뷰를 나누어야 겠다.
vue에서는 router를 수정해 signup/, login/ 두 개를 만들었다. signup에서는 커스텀 유저모델에 데이터를 저장하도록 했다...가 맞지만, 코딩을 다르게 했다. 아직 커스텀 유저 모델을 만들지 않아서 토큰을 받는 코드가 들어가있다. 수정해야겠다.
login에서는 username, password를 넘겨주면 토큰을 받아올 수 있게 했다.