diff --git a/common/djangoapps/third_party_auth/pipeline.py b/common/djangoapps/third_party_auth/pipeline.py index fd96aa88e7..7c66063764 100644 --- a/common/djangoapps/third_party_auth/pipeline.py +++ b/common/djangoapps/third_party_auth/pipeline.py @@ -87,6 +87,7 @@ from lms.djangoapps.verify_student.utils import earliest_allowed_verification_da from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers from openedx.core.djangoapps.user_api import accounts from openedx.core.djangoapps.user_authn import cookies as user_authn_cookies +from openedx.core.djangoapps.user_authn.utils import should_redirect_to_logistration_mircrofrontend from common.djangoapps.third_party_auth.utils import user_exists from common.djangoapps.track import segment from common.djangoapps.util.json_request import JsonResponse @@ -127,6 +128,9 @@ AUTH_ENTRY_REGISTER_API = 'register_api' # registration/login form/logic. AUTH_ENTRY_CUSTOM = getattr(settings, 'THIRD_PARTY_AUTH_CUSTOM_AUTH_FORMS', {}) +# If logistration MFE is enabled, the redirect should be to MFE instead of FE +BASE_URL = settings.LOGISTRATION_MICROFRONTEND_URL if should_redirect_to_logistration_mircrofrontend() else '' + def is_api(auth_entry): """Returns whether the auth entry point is via an API call.""" @@ -559,11 +563,11 @@ def ensure_user_information(strategy, auth_entry, backend=None, user=None, socia # invariants have been violated and future misbehavior is likely. def dispatch_to_login(): """Redirects to the login page.""" - return redirect(AUTH_DISPATCH_URLS[AUTH_ENTRY_LOGIN]) + return redirect(BASE_URL + AUTH_DISPATCH_URLS[AUTH_ENTRY_LOGIN]) def dispatch_to_register(): """Redirects to the registration page.""" - return redirect(AUTH_DISPATCH_URLS[AUTH_ENTRY_REGISTER]) + return redirect(BASE_URL + AUTH_DISPATCH_URLS[AUTH_ENTRY_REGISTER]) def should_force_account_creation(): """ For some third party providers, we auto-create user accounts """ diff --git a/openedx/core/djangoapps/user_authn/api/tests/test_views.py b/openedx/core/djangoapps/user_authn/api/tests/test_views.py index 12d18e3e63..2ca6881fee 100644 --- a/openedx/core/djangoapps/user_authn/api/tests/test_views.py +++ b/openedx/core/djangoapps/user_authn/api/tests/test_views.py @@ -77,6 +77,7 @@ class TPAContextViewTest(ThirdPartyAuthTestMixin, APITestCase): """ return { 'currentProvider': current_provider, + 'platformName': settings.PLATFORM_NAME, 'providers': self.get_provider_data(params) if params else [], 'secondaryProviders': [], 'finishAuthUrl': pipeline.get_complete_url(backend_name) if backend_name else None, diff --git a/openedx/core/djangoapps/user_authn/api/views.py b/openedx/core/djangoapps/user_authn/api/views.py index 5bc9b953e0..d1d9e5c5f6 100644 --- a/openedx/core/djangoapps/user_authn/api/views.py +++ b/openedx/core/djangoapps/user_authn/api/views.py @@ -8,7 +8,7 @@ from rest_framework.response import Response from rest_framework.throttling import AnonRateThrottle from rest_framework.views import APIView -from openedx.core.djangoapps.user_authn.utils import third_party_auth_context +from openedx.core.djangoapps.user_authn.views.utils import third_party_auth_context REDIRECT_KEY = 'redirect_to' diff --git a/openedx/core/djangoapps/user_authn/utils.py b/openedx/core/djangoapps/user_authn/utils.py index 5a0e83062d..693635d85a 100644 --- a/openedx/core/djangoapps/user_authn/utils.py +++ b/openedx/core/djangoapps/user_authn/utils.py @@ -5,90 +5,12 @@ Utility functions used during user authentication. import random import string -import six from django.conf import settings -from django.contrib import messages from django.utils import http -from django.utils.translation import ugettext as _ from oauth2_provider.models import Application from six.moves.urllib.parse import urlparse # pylint: disable=import-error -from common.djangoapps import third_party_auth from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers -from common.djangoapps.third_party_auth import pipeline - - -def third_party_auth_context(request, redirect_to, tpa_hint=None): - """ - Context for third party auth providers and the currently running pipeline. - - Arguments: - request (HttpRequest): The request, used to determine if a pipeline - is currently running. - redirect_to: The URL to send the user to following successful - authentication. - tpa_hint (string): An override flag that will return a matching provider - as long as its configuration has been enabled - - Returns: - dict - - """ - context = { - "currentProvider": None, - "providers": [], - "secondaryProviders": [], - "finishAuthUrl": None, - "errorMessage": None, - "registerFormSubmitButtonText": _("Create Account"), - "syncLearnerProfileData": False, - "pipeline_user_details": {} - } - - if third_party_auth.is_enabled(): - for enabled in third_party_auth.provider.Registry.displayed_for_login(tpa_hint=tpa_hint): - info = { - "id": enabled.provider_id, - "name": enabled.name, - "iconClass": enabled.icon_class or None, - "iconImage": enabled.icon_image.url if enabled.icon_image else None, - "loginUrl": pipeline.get_login_url( - enabled.provider_id, - pipeline.AUTH_ENTRY_LOGIN, - redirect_url=redirect_to, - ), - "registerUrl": pipeline.get_login_url( - enabled.provider_id, - pipeline.AUTH_ENTRY_REGISTER, - redirect_url=redirect_to, - ), - } - context["providers" if not enabled.secondary else "secondaryProviders"].append(info) - - running_pipeline = pipeline.get(request) - if running_pipeline is not None: - current_provider = third_party_auth.provider.Registry.get_from_pipeline(running_pipeline) - user_details = running_pipeline['kwargs']['details'] - if user_details: - context['pipeline_user_details'] = user_details - - if current_provider is not None: - context["currentProvider"] = current_provider.name - context["finishAuthUrl"] = pipeline.get_complete_url(current_provider.backend_name) - context["syncLearnerProfileData"] = current_provider.sync_learner_profile_data - - if current_provider.skip_registration_form: - # As a reliable way of "skipping" the registration form, we just submit it automatically - context["autoSubmitRegForm"] = True - - # Check for any error messages we may want to display: - for msg in messages.get_messages(request): - if msg.extra_tags.split()[0] == "social-auth": - # msg may or may not be translated. Try translating [again] in case we are able to: - context["errorMessage"] = _(six.text_type(msg)) # pylint: disable=E7610 - break - - return context def is_safe_login_or_logout_redirect(redirect_to, request_host, dot_client_id, require_https): diff --git a/openedx/core/djangoapps/user_authn/views/login_form.py b/openedx/core/djangoapps/user_authn/views/login_form.py index b9dd29b175..1cd92e6ac0 100644 --- a/openedx/core/djangoapps/user_authn/views/login_form.py +++ b/openedx/core/djangoapps/user_authn/views/login_form.py @@ -24,12 +24,10 @@ from openedx.core.djangoapps.user_api.accounts.utils import ( ) from openedx.core.djangoapps.user_api.helpers import FormDescription from openedx.core.djangoapps.user_authn.cookies import are_logged_in_cookies_set -from openedx.core.djangoapps.user_authn.utils import ( - should_redirect_to_logistration_mircrofrontend, - third_party_auth_context -) +from openedx.core.djangoapps.user_authn.utils import should_redirect_to_logistration_mircrofrontend from openedx.core.djangoapps.user_authn.views.password_reset import get_password_reset_form from openedx.core.djangoapps.user_authn.views.registration_form import RegistrationFormFactory +from openedx.core.djangoapps.user_authn.views.utils import third_party_auth_context from openedx.features.enterprise_support.api import enterprise_customer_for_request from openedx.features.enterprise_support.utils import ( get_enterprise_slug_login_url, diff --git a/openedx/core/djangoapps/user_authn/views/tests/test_logistration.py b/openedx/core/djangoapps/user_authn/views/tests/test_logistration.py index a59da6d128..608281b8a3 100644 --- a/openedx/core/djangoapps/user_authn/views/tests/test_logistration.py +++ b/openedx/core/djangoapps/user_authn/views/tests/test_logistration.py @@ -566,6 +566,7 @@ class LoginAndRegistrationTest(ThirdPartyAuthTestMixin, UrlResetMixin, ModuleSto auth_info = { "currentProvider": current_provider, + "platformName": settings.PLATFORM_NAME, "providers": providers, "secondaryProviders": [], "finishAuthUrl": finish_auth_url, @@ -596,6 +597,7 @@ class LoginAndRegistrationTest(ThirdPartyAuthTestMixin, UrlResetMixin, ModuleSto auth_info = { 'currentProvider': current_provider, + 'platformName': settings.PLATFORM_NAME, 'providers': [], 'secondaryProviders': [], 'finishAuthUrl': finish_auth_url, diff --git a/openedx/core/djangoapps/user_authn/views/utils.py b/openedx/core/djangoapps/user_authn/views/utils.py new file mode 100644 index 0000000000..275dd997b0 --- /dev/null +++ b/openedx/core/djangoapps/user_authn/views/utils.py @@ -0,0 +1,85 @@ +""" +User Auth Views Utils +""" +import six +from django.conf import settings +from django.contrib import messages +from django.utils.translation import ugettext as _ + +from common.djangoapps import third_party_auth +from common.djangoapps.third_party_auth import pipeline +from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers + + +def third_party_auth_context(request, redirect_to, tpa_hint=None): + """ + Context for third party auth providers and the currently running pipeline. + + Arguments: + request (HttpRequest): The request, used to determine if a pipeline + is currently running. + redirect_to: The URL to send the user to following successful + authentication. + tpa_hint (string): An override flag that will return a matching provider + as long as its configuration has been enabled + + Returns: + dict + + """ + context = { + "currentProvider": None, + "platformName": configuration_helpers.get_value('PLATFORM_NAME', settings.PLATFORM_NAME), + "providers": [], + "secondaryProviders": [], + "finishAuthUrl": None, + "errorMessage": None, + "registerFormSubmitButtonText": _("Create Account"), + "syncLearnerProfileData": False, + "pipeline_user_details": {} + } + + if third_party_auth.is_enabled(): + for enabled in third_party_auth.provider.Registry.displayed_for_login(tpa_hint=tpa_hint): + info = { + "id": enabled.provider_id, + "name": enabled.name, + "iconClass": enabled.icon_class or None, + "iconImage": enabled.icon_image.url if enabled.icon_image else None, + "loginUrl": pipeline.get_login_url( + enabled.provider_id, + pipeline.AUTH_ENTRY_LOGIN, + redirect_url=redirect_to, + ), + "registerUrl": pipeline.get_login_url( + enabled.provider_id, + pipeline.AUTH_ENTRY_REGISTER, + redirect_url=redirect_to, + ), + } + context["providers" if not enabled.secondary else "secondaryProviders"].append(info) + + running_pipeline = pipeline.get(request) + if running_pipeline is not None: + current_provider = third_party_auth.provider.Registry.get_from_pipeline(running_pipeline) + user_details = running_pipeline['kwargs']['details'] + if user_details: + context['pipeline_user_details'] = user_details + + if current_provider is not None: + context["currentProvider"] = current_provider.name + context["finishAuthUrl"] = pipeline.get_complete_url(current_provider.backend_name) + context["syncLearnerProfileData"] = current_provider.sync_learner_profile_data + + if current_provider.skip_registration_form: + # As a reliable way of "skipping" the registration form, we just submit it automatically + context["autoSubmitRegForm"] = True + + # Check for any error messages we may want to display: + for msg in messages.get_messages(request): + if msg.extra_tags.split()[0] == "social-auth": + # msg may or may not be translated. Try translating [again] in case we are able to: + context["errorMessage"] = _(six.text_type(msg)) # pylint: disable=E7610 + break + + return context