Skip to content
Snippets Groups Projects
Unverified Commit aa111fbc authored by George Babey's avatar George Babey Committed by GitHub
Browse files

Merge pull request #22472 from edx/hasnain-naveed/ENT-2505

ENT-2505 | By passing the check for forcing the login by third auth when user is…
parents 597c5d5f ece5e48f
No related merge requests found
...@@ -181,7 +181,7 @@ def _log_and_raise_inactive_user_auth_error(unauthenticated_user): ...@@ -181,7 +181,7 @@ def _log_and_raise_inactive_user_auth_error(unauthenticated_user):
raise AuthFailedError(_generate_not_activated_message(unauthenticated_user)) raise AuthFailedError(_generate_not_activated_message(unauthenticated_user))
def _authenticate_first_party(request, unauthenticated_user): def _authenticate_first_party(request, unauthenticated_user, third_party_auth_requested):
""" """
Use Django authentication on the given request, using rate limiting if configured Use Django authentication on the given request, using rate limiting if configured
""" """
...@@ -190,7 +190,11 @@ def _authenticate_first_party(request, unauthenticated_user): ...@@ -190,7 +190,11 @@ def _authenticate_first_party(request, unauthenticated_user):
# to fail and we can take advantage of the ratelimited backend # to fail and we can take advantage of the ratelimited backend
username = unauthenticated_user.username if unauthenticated_user else "" username = unauthenticated_user.username if unauthenticated_user else ""
_check_user_auth_flow(request.site, unauthenticated_user) # First time when a user login through third_party_auth account then user needs to link
# third_party account with the platform account by login through email and password that's
# why we need to by-pass this check when user is already authenticated by third_party_auth.
if not third_party_auth_requested:
_check_user_auth_flow(request.site, unauthenticated_user)
try: try:
password = normalize_password(request.POST['password']) password = normalize_password(request.POST['password'])
...@@ -403,7 +407,7 @@ def login_user(request): ...@@ -403,7 +407,7 @@ def login_user(request):
possibly_authenticated_user = user possibly_authenticated_user = user
if not is_user_third_party_authenticated: if not is_user_third_party_authenticated:
possibly_authenticated_user = _authenticate_first_party(request, user) possibly_authenticated_user = _authenticate_first_party(request, user, third_party_auth_requested)
if possibly_authenticated_user and password_policy_compliance.should_enforce_compliance_on_login(): if possibly_authenticated_user and password_policy_compliance.should_enforce_compliance_on_login():
# Important: This call must be made AFTER the user was successfully authenticated. # Important: This call must be made AFTER the user was successfully authenticated.
_enforce_password_policy_compliance(request, possibly_authenticated_user) _enforce_password_policy_compliance(request, possibly_authenticated_user)
......
...@@ -555,76 +555,123 @@ class LoginTest(SiteMixin, CacheIsolationTestCase): ...@@ -555,76 +555,123 @@ class LoginTest(SiteMixin, CacheIsolationTestCase):
'whitelisted': False, 'whitelisted': False,
'allowed_domain': 'edx.org', 'allowed_domain': 'edx.org',
'user_domain': 'edx.org', 'user_domain': 'edx.org',
'success': True 'success': True,
'is_third_party_authenticated': False
}, },
{ {
'switch_enabled': False, 'switch_enabled': False,
'whitelisted': True, 'whitelisted': True,
'allowed_domain': 'edx.org', 'allowed_domain': 'edx.org',
'user_domain': 'edx.org', 'user_domain': 'edx.org',
'success': True 'success': True,
'is_third_party_authenticated': False
}, },
{ {
'switch_enabled': True, 'switch_enabled': True,
'whitelisted': False, 'whitelisted': False,
'allowed_domain': 'edx.org', 'allowed_domain': 'edx.org',
'user_domain': 'edx.org', 'user_domain': 'edx.org',
'success': False 'success': False,
'is_third_party_authenticated': False
}, },
{ {
'switch_enabled': True, 'switch_enabled': True,
'whitelisted': False, 'whitelisted': False,
'allowed_domain': 'fake.org', 'allowed_domain': 'fake.org',
'user_domain': 'edx.org', 'user_domain': 'edx.org',
'success': True 'success': True,
'is_third_party_authenticated': False
}, },
{ {
'switch_enabled': True, 'switch_enabled': True,
'whitelisted': True, 'whitelisted': True,
'allowed_domain': 'edx.org', 'allowed_domain': 'edx.org',
'user_domain': 'edx.org', 'user_domain': 'edx.org',
'success': True 'success': True,
'is_third_party_authenticated': False
}, },
{ {
'switch_enabled': True, 'switch_enabled': True,
'whitelisted': False, 'whitelisted': False,
'allowed_domain': 'batman.gotham', 'allowed_domain': 'batman.gotham',
'user_domain': 'batman.gotham', 'user_domain': 'batman.gotham',
'success': False 'success': False,
'is_third_party_authenticated': False
},
{
'switch_enabled': True,
'whitelisted': True,
'allowed_domain': 'edx.org',
'user_domain': 'edx.org',
'success': True,
'is_third_party_authenticated': True
},
{
'switch_enabled': False,
'whitelisted': False,
'allowed_domain': 'edx.org',
'user_domain': 'fake.org',
'success': True,
'is_third_party_authenticated': True
}, },
) )
@ddt.unpack @ddt.unpack
def test_login_for_user_auth_flow(self, switch_enabled, whitelisted, allowed_domain, user_domain, success): def test_login_for_user_auth_flow(
self,
switch_enabled,
whitelisted,
allowed_domain,
user_domain,
success,
is_third_party_authenticated
):
""" """
Verify that `login._check_user_auth_flow` works as expected. Verify that `login._check_user_auth_flow` works as expected.
""" """
provider = 'Google'
username = 'batman' username = 'batman'
user_email = '{username}@{domain}'.format(username=username, domain=user_domain) user_email = '{username}@{domain}'.format(username=username, domain=user_domain)
user = self._create_user(username, user_email) user = self._create_user(username, user_email)
default_site_configuration_values = {
provider = 'Google'
site = self.set_up_site(allowed_domain, {
'SITE_NAME': allowed_domain, 'SITE_NAME': allowed_domain,
'THIRD_PARTY_AUTH_ONLY_DOMAIN': allowed_domain, 'THIRD_PARTY_AUTH_ONLY_DOMAIN': allowed_domain,
'THIRD_PARTY_AUTH_ONLY_PROVIDER': provider 'THIRD_PARTY_AUTH_ONLY_PROVIDER': provider,
}) }
if whitelisted:
AllowedAuthUser.objects.create(site=site, email=user.email)
else:
AllowedAuthUser.objects.filter(site=site, email=user.email).delete()
with ENABLE_LOGIN_USING_THIRDPARTY_AUTH_ONLY.override(switch_enabled): with ENABLE_LOGIN_USING_THIRDPARTY_AUTH_ONLY.override(switch_enabled):
value = None if success else u'As an {0} user, You must login with your {0} {1} account.'.format( if not is_third_party_authenticated:
allowed_domain, site = self.set_up_site(allowed_domain, default_site_configuration_values)
provider
) if whitelisted:
response, __ = self._login_response(user.email, self.password) AllowedAuthUser.objects.create(site=site, email=user.email)
self._assert_response( else:
response, AllowedAuthUser.objects.filter(site=site, email=user.email).delete()
success=success,
value=value, value = None if success else u'As an {0} user, You must login with your {0} {1} account.'.format(
) allowed_domain,
provider
)
response, __ = self._login_response(user.email, self.password)
self._assert_response(
response,
success=success,
value=value,
)
else:
default_site_configuration_values.update({'ENABLE_THIRD_PARTY_AUTH': True})
self.set_up_site(allowed_domain, default_site_configuration_values)
with patch('openedx.core.djangoapps.user_authn.views.login.pipeline'):
with patch(
'openedx.core.djangoapps.user_authn.views.login._check_user_auth_flow'
) as mock_check_user_auth_flow:
# user is already authenticated by third_party_auth then
# we should by-pass _check_user_auth_flow function
response, __ = self._login_response(user.email, self.password)
self._assert_response(
response,
success=success
)
self.assertFalse(mock_check_user_auth_flow.called)
@ddt.ddt @ddt.ddt
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment