Django Rest Framework (DRF)でトークン認証の際にユーザー名を取得する方法

準備するもの

・Django RESTFrameworkのプロジェクト

・Python

イントロ

通常、Djangoのプロジェクトならログインしているユーザー情報をHTMLテンプレートに出力することは簡単ですね。

ではAPIでクライアント側にDjangoのユーザー情報を渡したい場合はどうすればよいでしょうか。

今日は、これを解決するためにDjango REST Frameworkのトークン認証のメソッドを上書きしていきます。

準備するもの

GitHubから完成したサンプルコードを参考にしてください。

詳しい公式ドキュメンテーションがあるのでこれも参考にしてください。

https://www.django-rest-framework.org/api-guide/authentication/

CustomAuthTokenクラスを作成する

これからアプリのViews.pyにCustomAuthTokenのクラスをコピペしてそのリスポンスに返したいデータを追加するだけです。

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でURLも更新する

では、トークンを取得するURLも更新しましょう。

urlpatterns += [

    path('api-token-auth/', CustomAuthToken.as_view())

]

検証する

http POST http://127.0.0.1:8000/api-token-auth/ username="admin@gmail.com" password="admin"

ではコマンドラインからHTTPリクエストを送ってみましょう。

ちなみに通常のusernameの箇所にはユーザー名が入りますが、今回使用しているDjangoアプリはEmailでトークンが取得できるように変更しています。

OKっすね。

ちなみにEmailだけではなくでユーザー名も取得したい場合はこんな感じです。

        return Response({

            'token': token.key,

            'user_id': user.pk,

            'user_name': user.user_name

            # 'email': user.email

        })

お疲れ様です。