views.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. provider = get_provider_from_request(request, backend)
  19. request.strategy = load_strategy(request)
  20. backend_class = provider["auth_backend"]
  21. request.backend = backend_class(
  22. request.strategy,
  23. reverse("misago:social-complete", kwargs={"backend": backend}),
  24. )
  25. return f(request, backend, *args, **kwargs)
  26. return social_auth_view_wrapper
  27. @never_cache
  28. @social_auth_view
  29. def auth(request, backend):
  30. return do_auth(request.backend, redirect_name=REDIRECT_FIELD_NAME)
  31. @never_cache
  32. @csrf_exempt
  33. @social_auth_view
  34. def complete(request, backend, *args, **kwargs):
  35. return do_complete(
  36. request.backend,
  37. do_login,
  38. user=request.user,
  39. redirect_name=REDIRECT_FIELD_NAME,
  40. request=request,
  41. *args,
  42. **kwargs
  43. )
  44. def do_login(backend, user, social_user):
  45. user.backend = "misago.users.authbackends.MisagoBackend"
  46. login(backend.strategy.request, user)