@@ -85,8 +85,8 @@ 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+ person_id = resource .get ("cern_person_id" ) or resource . get ( "sub" )
89+ return dict (person_id = person_id , groups = resource . get ( "groups" , []) )
9090
9191
9292def account_roles_and_extra_data (account , resource , refresh_timedelta = None ):
@@ -178,10 +178,19 @@ def _account_info(remote, resp):
178178 resp ,
179179 )
180180
181- email = resource ["email" ]
182- external_id = str (resource ["cern_uid" ])
183- nice = resource ["preferred_username" ]
184- name = resource ["name" ]
181+ email = resource .get ("email" )
182+ if not email :
183+ raise OAuthCERNRejectedAccountError ("No email in userinfo" , remote , resp )
184+
185+ external_id = str (resource .get ("cern_uid" ) or resource .get ("sub" ))
186+ if not external_id :
187+ raise OAuthCERNRejectedAccountError ("No external_id in userinfo" , remote , resp )
188+
189+ raw_username = resource .get ("preferred_username" ) or email
190+ if "@" in raw_username :
191+ raw_username = raw_username .split ("@" )[0 ]
192+ nice = raw_username
193+ name = resource .get ("name" ) or nice
185194
186195 return dict (
187196 user = dict (email = email .lower (), profile = dict (username = nice , full_name = name )),
@@ -231,7 +240,7 @@ def account_setup(remote, token, resp):
231240 resource = get_resource (remote , resp )
232241
233242 with db .session .begin_nested ():
234- external_id = resource .get ("cern_uid" )
243+ external_id = resource .get ("cern_uid" ) or resource . get ( "sub" )
235244
236245 # Set CERN person ID in extra_data.
237246 token .remote_account .extra_data = {"external_id" : external_id }
0 commit comments