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())
]