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