Skip to content

Commit 3de64a9

Browse files
authored
Merge pull request #48 from akatsoulas/filter-users-method
Add a filter_users method in authentication class.
2 parents 01ed6d1 + e894268 commit 3de64a9

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

mozilla_django_oidc/auth.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,22 @@ def __init__(self, *args, **kwargs):
4444

4545
self.UserModel = get_user_model()
4646

47-
def create_user(self, email, **kwargs):
47+
def filter_users_by_claims(self, claims):
48+
"""Return all users matching the specified email."""
49+
email = claims.get('email')
50+
if not email:
51+
return self.UserModel.objects.none()
52+
return self.UserModel.objects.filter(email=email)
53+
54+
def create_user(self, claims):
4855
"""Return object for a newly created user account."""
4956
# bluntly stolen from django-browserid
5057
# https://github.com/mozilla/django-browserid/blob/master/django_browserid/auth.py
5158

5259
username_algo = import_from_settings('OIDC_USERNAME_ALGO', None)
60+
email = claims.get('email')
61+
if not email:
62+
return None
5363

5464
if username_algo:
5565
username = username_algo(email)
@@ -105,22 +115,19 @@ def authenticate(self, code=None, state=None):
105115
user_response.raise_for_status()
106116
user_info = user_response.json()
107117
email = user_info.get('email')
108-
if not email:
109-
return None
110118

111-
create_user = False
112-
try:
113-
return self.UserModel.objects.get(email=email)
114-
except self.UserModel.MultipleObjectsReturned:
119+
# email based filtering
120+
users = self.filter_users_by_claims(user_info)
121+
122+
if len(users) == 1:
123+
return users[0]
124+
elif len(users) > 1:
115125
# In the rare case that two user accounts have the same email address,
116126
# log and bail. Randomly selecting one seems really wrong.
117127
LOGGER.warn('Multiple users with email address %s.', email)
118128
return None
119-
except self.UserModel.DoesNotExist:
120-
create_user = import_from_settings('OIDC_CREATE_USER', True)
121-
122-
if create_user:
123-
user = self.create_user(email)
129+
elif import_from_settings('OIDC_CREATE_USER', True):
130+
user = self.create_user(user_info)
124131
return user
125132
else:
126133
LOGGER.debug('Login failed: No user with email %s found, and '

0 commit comments

Comments
 (0)