LoginSignup
6
3

More than 1 year has passed since last update.

Django REST frameworkのTokenAuthenticationについて

Last updated at Posted at 2021-12-26

TokenAuthenticationの仕組み

各ユーザごとにTokenという文字列を持っておく。
ログインエンドポイントが叩かれると、userIDとpasswordを認証してTokenを返す。
次回以降、フロントエンドはHeaderにToken情報を持たしてエンドポイントを叩く、
バックエンドはそのTokenを毎回確認することで認証ができる。

似たものにJWT認証がある。JWT認証と異なり、TokenはDBに直接格納されており、毎回参照して認証を行う。

コード

authtokenを追加する

settings.py
 INSTALLED_APPS = [
     ...
     'rest_framework.authtoken'
 ]

Authentication_Classesを定義する。

settings.py
 REST_FRAMEWORK = {
     'DEFAULT_AUTHENTICATION_CLASSES': [
         'rest_framework.authentication.BasicAuthentication',
         'rest_framework.authentication.SessionAuthentication',
     ]
 }

Userのpost_saveシグナルをキャッチしてTokenを追加する
models.pyに追加しておく。

models.py
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
]
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

ログイン時のToken発行Viewはデフォルトのものを使える。
obtain_auth_tokenはusernameとpasswordを受け取って{ 'token' : '9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b' }
をレスポンスで返す。

urls.py
from rest_framework.authtoken import views
urlpatterns += [
    path('api-token-auth/', views.obtain_auth_token)
]

カスタムすることも可能

auth.py
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Response

class CustomAuthToken(ObtainAuthToken):

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data,
                                           context={'request': request})
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response({
            'token': token.key,
            'user_id': user.pk,
            'email': user.email
        })

カスタムした場合はurls.pyはこんな感じ

urls.py
urlpatterns += [
    path('api-token-auth/', CustomAuthToken.as_view())
]

参考文献

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3