TokenAuthentication

1

장고 프로젝트

목록 보기
13/15
post-thumbnail

갑자기 옆차기 하는 느낌이지만 Token을 통한 인증과 식별을 해볼 것이다.

🌏 두괄식 참고자료: Link
수학과의 좌충우돌 프로그래밍: ssung.k
[DRF] TokenAuthentication (유저마다 토큰을 발급해서 유저를 식별해보자)


django에서 기본적으로 제공하는(default) SessionAuthenticationBasicAuthentication은 기본적인 문제가 있다고 한다.

외부 서비스 및 앱에서 세션인증을 사용할 수 없으며, 매번 username과 password를 넘기는 것은 위험하다는 것이 그 이유다.

따라서 이러한 경우에 TokenAuthentication을 사용하는 것이 권장되는 듯하다.

토큰을 사용하기 위한 준비

DRF는 이미 설치 했으므로 settings.pyINSTALLED_APPS 항목에 rest_framework.authtoken을 추가해준다.

이걸 하고나서 $ migrate를 수행해줘야 한다.

이렇게 authtoken에 관한 migrate가 이뤄지는 것을 볼 수 있었다.


SignUpView 예제

이렇게 하고 난 후에는 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이 정상적으로 발행되며 동시에 데이터베이스에도 등록된 것을 볼 수 있었다.


LoginView 예제

로그인 할 때에도 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()),

그러고 나서 usernamepassword를 담아 보내봤더니

으악! 작동하지 아니한다.

returnbody내용이 왜 없을까?

혹시 따라하다가 놓친 부분이 없나 다시 봐야겠다.

API 요청이 오면 토큰을 확인하여 유저가 누군지 식별하기

이걸 띄었다. 이 또한 DRF에서 제공해준다.
클라이언트가 HTTP요청을 할 때 headerAuthorization: Token 토큰값의 형태로 값을 첨부하면

request.user 또는 request.auth(Token 인스턴스)로 사용자를 식별할 수가 있다.

  • request.user will be a django User instance
  • request.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.authrest_framework.authtoken.models.Token의 인스턴스

Insomnia에서 요청을 보낼 때 header에 이 정보를 넣으면 된다. 아까 전에 회원가입 API를 실행했을 때 받아둔 토큰을 집어 넣으면 됨.

아래처럼 보내고 받았다.

header는 Authorization, 그에 대한 valueToken 한 칸 띄우고 토큰값으로 정확하게 적어주면 된다.

이렇게 보낸 결과는

성공!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
how라는 username을 인식했으며 token도 잘 알아본다.
아주아주 기분이 좋다.

이제 로그인 했을 때 토큰을 뿌려주고, 뿌린 토큰을 돌려 받으면서 사용자를 식별할 수 있는 API를 작성해봐야겠다.

아 짱이다. 이게 되다니 ㅋㅋ
날이 지날 수록 안전해지고 있다. 매우매우 좋다! 😎


[DRF] TokenAuthentication (유저마다 토큰을 발급해서 유저를 식별해보자)
[Django] Token 인증 적용하기, TokenAuthentication

1개의 댓글

comment-user-thumbnail
2022년 1월 5일

항상 잘 보고 있읍니다 화이팅입니다

답글 달기