api.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334
  1. import jwt
  2. from django.http import Http404, HttpResponseBadRequest, JsonResponse
  3. from django.views.decorators.csrf import csrf_exempt
  4. from django.views.decorators.http import require_POST
  5. from .user import get_or_create_user
  6. from .validators import UserDataValidator
  7. @csrf_exempt
  8. @require_POST
  9. def sso_sync(request):
  10. if not request.settings.enable_sso:
  11. raise Http404()
  12. access_token = request.POST.get("access_token")
  13. if not access_token:
  14. return HttpResponseBadRequest("Request did not contain the access token")
  15. try:
  16. user_data = jwt.decode(
  17. access_token, request.settings.sso_private_key, algorithms=["HS256"]
  18. )
  19. except jwt.PyJWTError:
  20. return HttpResponseBadRequest("Access token is invalid")
  21. validator = UserDataValidator(user_data)
  22. if not validator.is_valid():
  23. failed_fields = ", ".join(validator.errors.keys())
  24. return HttpResponseBadRequest(f"User data failed to validate: {failed_fields}")
  25. user = get_or_create_user(request, validator.cleaned_data)
  26. return JsonResponse({"id": user.id})