@@ -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