갑자기 옆차기 하는 느낌이지만 Token을 통한 인증과 식별을 해볼 것이다.
🌏 두괄식 참고자료: Link
수학과의 좌충우돌 프로그래밍: ssung.k
[DRF] TokenAuthentication (유저마다 토큰을 발급해서 유저를 식별해보자)
django에서 기본적으로 제공하는(default) SessionAuthentication
과 BasicAuthentication
은 기본적인 문제가 있다고 한다.
외부 서비스 및 앱에서 세션인증을 사용할 수 없으며, 매번 username과 password를 넘기는 것은 위험하다는 것이 그 이유다.
따라서 이러한 경우에 TokenAuthentication
을 사용하는 것이 권장되는 듯하다.
DRF는 이미 설치 했으므로 settings.py
의 INSTALLED_APPS
항목에 rest_framework.authtoken
을 추가해준다.
이걸 하고나서 $ migrate
를 수행해줘야 한다.
이렇게 authtoken
에 관한 migrate
가 이뤄지는 것을 볼 수 있었다.
이렇게 하고 난 후에는 SignUp
view를 하나 만들어 볼 것임.
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authtoken.models import Token
# Token을 통한 SignUp View 만들어 보기
class SignUpView(APIView):
def post(self, request):
user = User.objects.create(username=request.data['username'], password=request.data['password'])
user.save()
token = Token.objects.create(user=user)
return Response({"Token": token.key})
이렇게 짜놓고 url도 붙여줘야 함.
path('token-signup/', views.SignUpView.as_view()),
그러고 나서 Insomnia Client로 요청을 넣어보면
가입 요청 시 token
이 정상적으로 발행되며 동시에 데이터베이스에도 등록된 것을 볼 수 있었다.
로그인 할 때에도 token
을 주도록 해볼 것이다.
과정은 위와 동일하다. View를 짜고 url을 붙인다. 그리고 서버를 올려서 Insomnia로 호출해본다.
from django.contrib.auth import authenticate
from django.contrib.auth.models import User
class LoginView(APIView):
def post(self, request):
user = authenticate(username=request.data['username'], password=request.data['password'])
if user is not None:
token = Token.objects.get(user=user)
return Response({"Token": token.key})
else:
return Response(status=401)
마찬가지로 url 붙여준다.
path('token-login/', views.LoginView.as_view()),
그러고 나서 username
과 password
를 담아 보내봤더니
으악! 작동하지 아니한다.
return
할 body
내용이 왜 없을까?
혹시 따라하다가 놓친 부분이 없나 다시 봐야겠다.
이걸 띄었다. 이 또한 DRF에서 제공해준다.
클라이언트가 HTTP요청을 할 때 header
에 Authorization: Token 토큰값
의 형태로 값을 첨부하면
request.user
또는 request.auth
(Token 인스턴스)로 사용자를 식별할 수가 있다.
request.user
will be a django User
instancerequest.auth
will be a rest_framework.authtoken.models.Token
instance.일단 settings.py
로 가서 DRF의 인증방법 중 어떤 것을 쓸 것인지 명시해준다.
# settings.py
...
INSTALLED_APPS = [
...
...
...
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
]
}
...
이렇게 적어주고 API 하나를 실행해볼 것이다.
예제를 보고 따라서 후딱 만들었다.
# app/views.py
class TestList(APIView):
def get(self, request, format=None):
print(request.user)
print(request.auth)
queryset = BicepsCurl.objects.all()
serializer = serializers.BicepsSerializer(queryset, many=True)
return Response(serializer.data)
print
함수를 써서 요청을 누가 한 건지 토큰은 뭔지를 알아볼 것이다.
위에 적어놓았듯
request.user
는 django의 user 인스턴스
request.auth
는 rest_framework.authtoken.models.Token
의 인스턴스
Insomnia에서 요청을 보낼 때 header에 이 정보를 넣으면 된다. 아까 전에 회원가입 API를 실행했을 때 받아둔 토큰을 집어 넣으면 됨.
아래처럼 보내고 받았다.
header
는 Authorization, 그에 대한 value
는 Token 한 칸 띄우고 토큰값으로 정확하게 적어주면 된다.
이렇게 보낸 결과는
성공!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
how라는 username을 인식했으며 token
도 잘 알아본다.
아주아주 기분이 좋다.
이제 로그인 했을 때 토큰을 뿌려주고, 뿌린 토큰을 돌려 받으면서 사용자를 식별할 수 있는 API를 작성해봐야겠다.
아 짱이다. 이게 되다니 ㅋㅋ
날이 지날 수록 안전해지고 있다. 매우매우 좋다! 😎
[DRF] TokenAuthentication (유저마다 토큰을 발급해서 유저를 식별해보자)
[Django] Token 인증 적용하기, TokenAuthentication
항상 잘 보고 있읍니다 화이팅입니다