準備するもの
・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 })
お疲れ様です。