@@ -85,8 +85,10 @@ def find_remote_by_client_id(client_id):
8585
8686def fetch_extra_data (resource ):
8787 """Return a dict with extra data retrieved from CERN OAuth."""
88- person_id = resource .get ("cern_person_id" )
89- return dict (person_id = person_id , groups = resource ["groups" ])
88+ data = {"groups" : resource .get ("groups" , [])}
89+ if resource .get ("cern_person_id" ):
90+ data ["person_id" ] = resource ["cern_person_id" ]
91+ return data
9092
9193
9294def account_roles_and_extra_data (account , resource , refresh_timedelta = None ):
@@ -178,10 +180,19 @@ def _account_info(remote, resp):
178180 resp ,
179181 )
180182
181- email = resource ["email" ]
182- external_id = str (resource ["cern_uid" ])
183- nice = resource ["preferred_username" ]
184- name = resource ["name" ]
183+ email = resource .get ("email" )
184+ if not email :
185+ raise OAuthCERNRejectedAccountError ("No email in userinfo" , remote , resp )
186+
187+ external_id = str (resource .get ("cern_uid" ) or resource .get ("sub" ))
188+ if not external_id :
189+ raise OAuthCERNRejectedAccountError ("No external_id in userinfo" , remote , resp )
190+
191+ raw_username = resource .get ("preferred_username" ) or email
192+ if "@" in raw_username :
193+ raw_username = raw_username .replace ("@" , "_" ).replace ("." , "_" )
194+ nice = raw_username
195+ name = resource .get ("name" ) or nice
185196
186197 return dict (
187198 user = dict (email = email .lower (), profile = dict (username = nice , full_name = name )),
@@ -231,7 +242,7 @@ def account_setup(remote, token, resp):
231242 resource = get_resource (remote , resp )
232243
233244 with db .session .begin_nested ():
234- external_id = resource .get ("cern_uid" )
245+ external_id = resource .get ("cern_uid" ) or resource . get ( "sub" )
235246
236247 # Set CERN person ID in extra_data.
237248 token .remote_account .extra_data = {"external_id" : external_id }
0 commit comments