@@ -123,7 +123,6 @@ async def handle_oidc_callback(self, request: SynapseRequest) -> None:
123
123
Args:
124
124
request: the incoming request from the browser.
125
125
"""
126
-
127
126
# The provider might redirect with an error.
128
127
# In that case, just display it as-is.
129
128
if b"error" in request .args :
@@ -137,8 +136,12 @@ async def handle_oidc_callback(self, request: SynapseRequest) -> None:
137
136
# either the provider misbehaving or Synapse being misconfigured.
138
137
# The only exception of that is "access_denied", where the user
139
138
# probably cancelled the login flow. In other cases, log those errors.
140
- if error != "access_denied" :
141
- logger .error ("Error from the OIDC provider: %s %s" , error , description )
139
+ logger .log (
140
+ logging .INFO if error == "access_denied" else logging .ERROR ,
141
+ "Received OIDC callback with error: %s %s" ,
142
+ error ,
143
+ description ,
144
+ )
142
145
143
146
self ._sso_handler .render_error (request , error , description )
144
147
return
@@ -149,7 +152,7 @@ async def handle_oidc_callback(self, request: SynapseRequest) -> None:
149
152
# Fetch the session cookie
150
153
session = request .getCookie (SESSION_COOKIE_NAME ) # type: Optional[bytes]
151
154
if session is None :
152
- logger .info ("No session cookie found " )
155
+ logger .info ("Received OIDC callback, with no session cookie" )
153
156
self ._sso_handler .render_error (
154
157
request , "missing_session" , "No session cookie found"
155
158
)
@@ -169,7 +172,7 @@ async def handle_oidc_callback(self, request: SynapseRequest) -> None:
169
172
170
173
# Check for the state query parameter
171
174
if b"state" not in request .args :
172
- logger .info ("State parameter is missing " )
175
+ logger .info ("Received OIDC callback, with no state parameter " )
173
176
self ._sso_handler .render_error (
174
177
request , "invalid_request" , "State parameter is missing"
175
178
)
@@ -183,14 +186,16 @@ async def handle_oidc_callback(self, request: SynapseRequest) -> None:
183
186
session , state
184
187
)
185
188
except (MacaroonDeserializationException , ValueError ) as e :
186
- logger .exception ("Invalid session" )
189
+ logger .exception ("Invalid session for OIDC callback " )
187
190
self ._sso_handler .render_error (request , "invalid_session" , str (e ))
188
191
return
189
192
except MacaroonInvalidSignatureException as e :
190
- logger .exception ("Could not verify session" )
193
+ logger .exception ("Could not verify session for OIDC callback " )
191
194
self ._sso_handler .render_error (request , "mismatching_session" , str (e ))
192
195
return
193
196
197
+ logger .info ("Received OIDC callback for IdP %s" , session_data .idp_id )
198
+
194
199
oidc_provider = self ._providers .get (session_data .idp_id )
195
200
if not oidc_provider :
196
201
logger .error ("OIDC session uses unknown IdP %r" , oidc_provider )
@@ -565,13 +570,16 @@ async def _fetch_userinfo(self, token: Token) -> UserInfo:
565
570
Returns:
566
571
UserInfo: an object representing the user.
567
572
"""
573
+ logger .debug ("Using the OAuth2 access_token to request userinfo" )
568
574
metadata = await self .load_metadata ()
569
575
570
576
resp = await self ._http_client .get_json (
571
577
metadata ["userinfo_endpoint" ],
572
578
headers = {"Authorization" : ["Bearer {}" .format (token ["access_token" ])]},
573
579
)
574
580
581
+ logger .debug ("Retrieved user info from userinfo endpoint: %r" , resp )
582
+
575
583
return UserInfo (resp )
576
584
577
585
async def _parse_id_token (self , token : Token , nonce : str ) -> UserInfo :
@@ -600,17 +608,19 @@ async def _parse_id_token(self, token: Token, nonce: str) -> UserInfo:
600
608
claims_cls = ImplicitIDToken
601
609
602
610
alg_values = metadata .get ("id_token_signing_alg_values_supported" , ["RS256" ])
603
-
604
611
jwt = JsonWebToken (alg_values )
605
612
606
613
claim_options = {"iss" : {"values" : [metadata ["issuer" ]]}}
607
614
615
+ id_token = token ["id_token" ]
616
+ logger .debug ("Attempting to decode JWT id_token %r" , id_token )
617
+
608
618
# Try to decode the keys in cache first, then retry by forcing the keys
609
619
# to be reloaded
610
620
jwk_set = await self .load_jwks ()
611
621
try :
612
622
claims = jwt .decode (
613
- token [ " id_token" ] ,
623
+ id_token ,
614
624
key = jwk_set ,
615
625
claims_cls = claims_cls ,
616
626
claims_options = claim_options ,
@@ -620,13 +630,15 @@ async def _parse_id_token(self, token: Token, nonce: str) -> UserInfo:
620
630
logger .info ("Reloading JWKS after decode error" )
621
631
jwk_set = await self .load_jwks (force = True ) # try reloading the jwks
622
632
claims = jwt .decode (
623
- token [ " id_token" ] ,
633
+ id_token ,
624
634
key = jwk_set ,
625
635
claims_cls = claims_cls ,
626
636
claims_options = claim_options ,
627
637
claims_params = claims_params ,
628
638
)
629
639
640
+ logger .debug ("Decoded id_token JWT %r; validating" , claims )
641
+
630
642
claims .validate (leeway = 120 ) # allows 2 min of clock skew
631
643
return UserInfo (claims )
632
644
@@ -726,27 +738,25 @@ async def handle_oidc_callback(
726
738
"""
727
739
# Exchange the code with the provider
728
740
try :
729
- logger .debug ("Exchanging code" )
741
+ logger .debug ("Exchanging OAuth2 code for a token " )
730
742
token = await self ._exchange_code (code )
731
743
except OidcError as e :
732
- logger .exception ("Could not exchange code" )
744
+ logger .exception ("Could not exchange OAuth2 code" )
733
745
self ._sso_handler .render_error (request , e .error , e .error_description )
734
746
return
735
747
736
- logger .debug ("Successfully obtained OAuth2 access token" )
748
+ logger .debug ("Successfully obtained OAuth2 token data: %r" , token )
737
749
738
750
# Now that we have a token, get the userinfo, either by decoding the
739
751
# `id_token` or by fetching the `userinfo_endpoint`.
740
752
if self ._uses_userinfo :
741
- logger .debug ("Fetching userinfo" )
742
753
try :
743
754
userinfo = await self ._fetch_userinfo (token )
744
755
except Exception as e :
745
756
logger .exception ("Could not fetch userinfo" )
746
757
self ._sso_handler .render_error (request , "fetch_error" , str (e ))
747
758
return
748
759
else :
749
- logger .debug ("Extracting userinfo from id_token" )
750
760
try :
751
761
userinfo = await self ._parse_id_token (token , nonce = session_data .nonce )
752
762
except Exception as e :
0 commit comments