@@ -818,14 +818,30 @@ async def _fetch_userinfo(self, token: Token) -> UserInfo:
818818 logger .debug ("Using the OAuth2 access_token to request userinfo" )
819819 metadata = await self .load_metadata ()
820820
821- resp = await self ._http_client .get_json (
821+ resp = await self ._http_client .get_raw (
822822 metadata ["userinfo_endpoint" ],
823823 headers = {"Authorization" : ["Bearer {}" .format (token ["access_token" ])]},
824824 )
825825
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 )
827843
828- return UserInfo (resp )
844+ return UserInfo (decoded_resp )
829845
830846 async def _verify_jwt (
831847 self ,
0 commit comments