serializers.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from rest_framework import serializers
  2. from social_core import exceptions
  3. from social_django.utils import load_backend, load_strategy
  4. from djoser.conf import settings
  5. class ProviderAuthSerializer(serializers.Serializer):
  6. # GET auth token
  7. access = serializers.CharField(read_only=True)
  8. refresh = serializers.CharField(read_only=True)
  9. user = serializers.CharField(read_only=True)
  10. def create(self, validated_data):
  11. user = validated_data["user"]
  12. return settings.SOCIAL_AUTH_TOKEN_STRATEGY.obtain(user)
  13. def validate(self, attrs):
  14. request = self.context["request"]
  15. if "state" in request.GET:
  16. self._validate_state(request.GET["state"])
  17. strategy = load_strategy(request)
  18. redirect_uri = strategy.session_get("redirect_uri")
  19. backend_name = self.context["view"].kwargs["provider"]
  20. backend = load_backend(strategy, backend_name, redirect_uri=redirect_uri)
  21. try:
  22. user = backend.auth_complete()
  23. except exceptions.AuthException as e:
  24. raise serializers.ValidationError(str(e))
  25. return {"user": user}
  26. def _validate_state(self, value):
  27. request = self.context["request"]
  28. strategy = load_strategy(request)
  29. redirect_uri = strategy.session_get("redirect_uri")
  30. backend_name = self.context["view"].kwargs["provider"]
  31. backend = load_backend(strategy, backend_name, redirect_uri=redirect_uri)
  32. try:
  33. backend.validate_state()
  34. except exceptions.AuthMissingParameter:
  35. raise serializers.ValidationError(
  36. "State could not be found in request data."
  37. )
  38. except exceptions.AuthStateMissing:
  39. raise serializers.ValidationError(
  40. "State could not be found in server-side session data."
  41. )
  42. except exceptions.AuthStateForbidden:
  43. raise serializers.ValidationError("Invalid state has been provided.")
  44. return value