Skip to content

Commit 62e0513

Browse files
committed
Try to JWT decode userinfo response if JSON parsing is failing
1 parent 274f289 commit 62e0513

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

synapse/handlers/oidc.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)