diadia

興味があることをやってみる。自分のメモを残しておきます。

DRF tokenからuserオブジェクトを取得する

userオブジェクトを取得する道筋

例えばandroidの画面にuserのプロフィールを表示したいとする。そのためには、userオブジェクトが必要だ。 どの様にすればUserオブジェクトが取得できるのか。

TokenAuthenticationを採用している場合にはユーザーに紐付いたトークンがデータベースに保存してある。 したがってトークンを利用すればUserオブジェクトを取得できる。

では、トークンはどうすればサーバー側(django側)で取得できるのか。 トークンはHTTPリクエストのヘッダーに添付されて送られる。 したがってリクエストのヘッダーからトークン情報をとってくれば良い。

サンプルコード

from rest_framework.authtoken.models import Token

class ProfileAPIView(APIView):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)

    def get(self, request, *args, **kwargs):
        #HTTPリクエストヘッダーのトークン情報からユーザーを特定する
        token = self.request.META['HTTP_AUTHORIZATION'].split(" ")[1]
        #print(token)
        #Userオブジェクトの取得
        user_obj = Token.objects.get(key=token).user
        profile_obj = Profile.objects.get(user=user_obj)

        serializer_context = {}
        serializer_context["profile_obj"] = ProfileSerializer(profile_obj).data
        return Response(serializer_context)

解説

httpプロトコルのヘッダー情報は、request.METAから取得することができる。 リクエストヘッダの内容を取得する まとめ - diadia

rest_framework.authtoken.models.Tokenクラスがある。 これを利用するとUserオブジェクトを直接取得できる。 参考: python - Get user object from token string in DRF? - Stack Overflow