views.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from django.contrib.auth import REDIRECT_FIELD_NAME, login
  2. from django.core.exceptions import PermissionDenied
  3. from django.http import Http404
  4. from django.urls import reverse
  5. from django.utils.translation import gettext as _
  6. from django.views.decorators.cache import never_cache
  7. from django.views.decorators.csrf import csrf_exempt
  8. from social_core.actions import do_auth, do_complete
  9. from social_django.views import _do_login
  10. from social_django.utils import load_strategy
  11. def get_provider_from_request(request, backend):
  12. try:
  13. return request.socialauth[backend]
  14. except KeyError:
  15. raise Http404()
  16. def social_auth_view(f):
  17. def social_auth_view_wrapper(request, backend, *args, **kwargs):
  18. if request.settings.enable_sso:
  19. raise PermissionDenied(_("Please use the 3rd party site to login."))
  20. provider = get_provider_from_request(request, backend)
  21. request.strategy = load_strategy(request)
  22. backend_class = provider["auth_backend"]
  23. request.backend = backend_class(
  24. request.strategy,
  25. reverse("misago:social-complete", kwargs={"backend": backend}),
  26. )
  27. return f(request, backend, *args, **kwargs)
  28. return social_auth_view_wrapper
  29. @never_cache
  30. @social_auth_view
  31. def auth(request, backend):
  32. return do_auth(request.backend, redirect_name=REDIRECT_FIELD_NAME)
  33. @never_cache
  34. @csrf_exempt
  35. @social_auth_view
  36. def complete(request, backend, *args, **kwargs):
  37. return do_complete(
  38. request.backend,
  39. do_login,
  40. user=request.user,
  41. redirect_name=REDIRECT_FIELD_NAME,
  42. request=request,
  43. *args,
  44. **kwargs
  45. )
  46. def do_login(backend, user, social_user):
  47. user.backend = "misago.users.authbackends.MisagoBackend"
  48. login(backend.strategy.request, user)