私はDRF 1.10とPython 3.5を使用しています。Django Rest Frameworkでトークン認証を正しく設定するにはどうしたらいいですか?
ログイン時にDRFのrest_framework.authtoken.models.Token
を使用してユーザーを認証しようとしています。これは私が持っているものである:ログインに
views.py
class LoginView(views.APIView):
serializer_class = LoginSerializer
def post(self, request, **kwargs):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
user = User.objects.get(username=serializer.data['username'])
token = Token.objects.create(user=user)
response = {}
response['user'] = serializer.data
response['token'] = token.key
return Response(response, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializers.py
class LoginSerializer(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField()
def validate(self, attrs):
username = attrs.get("username").lower()
password = attrs.get("password")
user = authenticate(username=username, password=password)
if user:
attrs["user"] = user
return attrs
else:
raise serializers.ValidationError(
"Unable to login with credentials provided."
)
は、私はトークンをユーザーに提供し、上の私はそのトークンを削除するにログアウトします。問題は、トークンのキーを持つトークンとそれが関連しているユーザーを検索してトークンを削除しようとすると、トークンを見つけることができないということです。ログアウトビューは次のとおりです。
class LogoutView(views.APIView):
def post(self, request, **kwargs):
try:
token = request.META['HTTP_AUTHORIZATION'].split(" ")[1]
invalidate_token = Token.objects.filter(key=token, user=request.user)
invalidate_token.delete()
return Response({ detail: "Logged out"}, status=status.HTTP_202_ACCEPTED)
except:
return Response({"error": ["Token does not exist!"]}, status=status.HTTP_400_BAD_REQUEST)
ユーザをログアウトしようとすると問題が発生しました。 request.user
はまだAnonymousUser
であり、User
ではないことに気付きました。これを修正するにはどうすればいいですか?
これは郵便配達で、私のヘッダです。
あなたはDjangoの管理者がインストールされている場合は、することができますあなたの認証トークンをそこに表示してください。それらを比較して、使用しているトークンがまだ存在し、正しいdjangoユーザに関連付けられていることを確認してください。 – Soviut
@Soviut管理ツールを表示しました。トークンは存在し、正しいユーザーと関連付けられていますが、依然として適切に機能しません。 –