@@ -274,25 +274,26 @@ pub(crate) async fn handler(
274274 )
275275 . await ?;
276276
277+ let mut jwks = None ;
278+
277279 let mut context = AttributeMappingContext :: new ( ) ;
278280 if let Some ( id_token) = token_response. id_token . as_ref ( ) {
279- // Fetch the JWKS
280- let jwks =
281+ jwks = Some (
281282 mas_oidc_client:: requests:: jose:: fetch_jwks ( & client, lazy_metadata. jwks_uri ( ) . await ?)
282- . await ?;
283+ . await ?,
284+ ) ;
283285
284- let verification_data = JwtVerificationData {
286+ let id_token_verification_data = JwtVerificationData {
285287 issuer : & provider. issuer ,
286- jwks : & jwks,
287- // TODO: make that configurable
288- signing_algorithm : & mas_iana:: jose:: JsonWebSignatureAlg :: Rs256 ,
288+ jwks : jwks. as_ref ( ) . unwrap ( ) ,
289+ signing_algorithm : & provider. id_token_signed_response_alg ,
289290 client_id : & provider. client_id ,
290291 } ;
291292
292293 // Decode and verify the ID token
293294 let id_token = mas_oidc_client:: requests:: jose:: verify_id_token (
294295 id_token,
295- verification_data ,
296+ id_token_verification_data ,
296297 None ,
297298 clock. now ( ) ,
298299 ) ?;
@@ -304,7 +305,7 @@ pub(crate) async fn handler(
304305 . extract_optional_with_options (
305306 & mut claims,
306307 TokenHash :: new (
307- verification_data . signing_algorithm ,
308+ id_token_verification_data . signing_algorithm ,
308309 & token_response. access_token ,
309310 ) ,
310311 )
@@ -314,7 +315,7 @@ pub(crate) async fn handler(
314315 mas_jose:: claims:: C_HASH
315316 . extract_optional_with_options (
316317 & mut claims,
317- TokenHash :: new ( verification_data . signing_algorithm , & code) ,
318+ TokenHash :: new ( id_token_verification_data . signing_algorithm , & code) ,
318319 )
319320 . map_err ( mas_oidc_client:: error:: IdTokenError :: from) ?;
320321
@@ -331,15 +332,42 @@ pub(crate) async fn handler(
331332 }
332333
333334 let userinfo = if provider. fetch_userinfo {
334- Some ( json ! (
335- mas_oidc_client:: requests:: userinfo:: fetch_userinfo(
336- & client,
337- lazy_metadata. userinfo_endpoint( ) . await ?,
338- token_response. access_token. as_str( ) ,
339- None ,
340- )
341- . await ?
342- ) )
335+ Some ( json ! ( match & provider. userinfo_signed_response_alg {
336+ Some ( signing_algorithm) => {
337+ let jwks = match jwks {
338+ Some ( jwks) => jwks,
339+ None => {
340+ mas_oidc_client:: requests:: jose:: fetch_jwks(
341+ & client,
342+ lazy_metadata. jwks_uri( ) . await ?,
343+ )
344+ . await ?
345+ }
346+ } ;
347+
348+ mas_oidc_client:: requests:: userinfo:: fetch_userinfo(
349+ & client,
350+ lazy_metadata. userinfo_endpoint( ) . await ?,
351+ token_response. access_token. as_str( ) ,
352+ Some ( JwtVerificationData {
353+ issuer: & provider. issuer,
354+ jwks: & jwks,
355+ signing_algorithm,
356+ client_id: & provider. client_id,
357+ } ) ,
358+ )
359+ . await ?
360+ }
361+ None => {
362+ mas_oidc_client:: requests:: userinfo:: fetch_userinfo(
363+ & client,
364+ lazy_metadata. userinfo_endpoint( ) . await ?,
365+ token_response. access_token. as_str( ) ,
366+ None ,
367+ )
368+ . await ?
369+ }
370+ } ) )
343371 } else {
344372 None
345373 } ;
0 commit comments