@@ -818,14 +818,30 @@ async def _fetch_userinfo(self, token: Token) -> UserInfo:
818
818
logger .debug ("Using the OAuth2 access_token to request userinfo" )
819
819
metadata = await self .load_metadata ()
820
820
821
- resp = await self ._http_client .get_json (
821
+ resp = await self ._http_client .get_raw (
822
822
metadata ["userinfo_endpoint" ],
823
823
headers = {"Authorization" : ["Bearer {}" .format (token ["access_token" ])]},
824
824
)
825
825
826
- logger .debug ("Retrieved user info from userinfo endpoint: %r" , resp )
826
+ try :
827
+ decoded_resp = json_decoder .decode (resp .decode ("utf-8" ))
828
+ except json .JSONDecodeError :
829
+ # JSON parsing failed, the userinfo may be JWT so let's try to decode
830
+ alg_values = metadata .get (
831
+ "id_token_signing_alg_values_supported" , ["RS256" ]
832
+ )
833
+ jwt = JsonWebToken (alg_values )
834
+ jwk_set = await self .load_jwks ()
835
+ try :
836
+ decoded_resp = jwt .decode (resp , key = jwk_set )
837
+ except ValueError :
838
+ logger .info ("Reloading JWKS after decode error" )
839
+ jwk_set = await self .load_jwks (force = True ) # try reloading the jwks
840
+ decoded_resp = jwt .decode (resp , key = jwk_set )
841
+
842
+ logger .debug ("Retrieved user info from userinfo endpoint: %r" , decoded_resp )
827
843
828
- return UserInfo (resp )
844
+ return UserInfo (decoded_resp )
829
845
830
846
async def _verify_jwt (
831
847
self ,
0 commit comments