@@ -103,49 +103,50 @@ impl OidcTokenVerifier {
103103 & self ,
104104 token : & OidcToken ,
105105 expected_public_key_sec1_base64 : String ,
106+ client_name : Option < & str > ,
106107 ) -> Result < IdTokenClaims < EmptyAdditionalClaims , CoreGenderClaim > , OidcTokenVerifierError > {
107108 // Step 1: Extract the token and other parameters based on the OIDC provider
108109 let ( oidc_token, jwk_set_url, client_id, issuer_url) = match token {
109110 OidcToken :: Google { token } => (
110111 token,
111112 self . environment . google_jwk_set_url ( ) ,
112- self . environment . google_client_id ( ) ,
113+ self . environment . google_client_id ( client_name ) ,
113114 self . environment . google_issuer_url ( ) ,
114115 ) ,
115116 OidcToken :: Apple { token } => (
116117 token,
117118 self . environment . apple_jwk_set_url ( ) ,
118- self . environment . apple_client_id ( ) ,
119+ self . environment . apple_client_id ( client_name ) ,
119120 self . environment . apple_issuer_url ( ) ,
120121 ) ,
121122 } ;
122123
123124 // Load the public keys from the OIDC provider
124125 let signature_keys = self . get_jwk_set ( & jwk_set_url) . await ?. as_ref ( ) . clone ( ) ;
125126
126- // Step 3: Create the token verifier
127- let token_verifier =
128- CoreIdTokenVerifier :: new_public_client ( client_id, issuer_url. clone ( ) , signature_keys)
129- . set_issue_time_verifier_fn ( issue_time_verifier) ;
130-
131- // Step 4: Verify the token and extract claims
127+ // Step 3: Verify the token and extract claims
132128 let oidc_token = CoreIdToken :: from_str ( oidc_token) . map_err ( |err| {
133129 tracing:: warn!( message = "Failed to parse OIDC token" , err = ?err) ;
134130 OidcTokenVerifierError :: TokenParseError
135131 } ) ?;
136132
137- // Step 5 : Verify the nonce and extract the claims
133+ // Step 4 : Verify the token against the client ID selected by client_name
138134 let claims = oidc_token
139135 . claims (
140- & token_verifier,
141- OidcNonceVerifier :: new ( expected_public_key_sec1_base64) ,
136+ & CoreIdTokenVerifier :: new_public_client (
137+ client_id,
138+ issuer_url. clone ( ) ,
139+ signature_keys. clone ( ) ,
140+ )
141+ . set_issue_time_verifier_fn ( issue_time_verifier) ,
142+ OidcNonceVerifier :: new ( expected_public_key_sec1_base64. clone ( ) ) ,
142143 )
143144 . map_err ( |err| {
144145 tracing:: error!( message = "Token verification error" , err = ?err, issuer = ?issuer_url) ;
145146 match err {
146147 ClaimsVerificationError :: InvalidNonce ( e) =>
147148 OidcTokenVerifierError :: InvalidNonce ( e. clone ( ) ) ,
148- _ => OidcTokenVerifierError :: TokenVerificationError
149+ _ => OidcTokenVerifierError :: TokenVerificationError ,
149150 }
150151 } ) ?;
151152
@@ -226,16 +227,17 @@ mod tests {
226227 provider : OidcProvider ,
227228 token : String ,
228229 public_key : String ,
230+ client_name : Option < & str > ,
229231 ) -> Result < IdTokenClaims < EmptyAdditionalClaims , CoreGenderClaim > , OidcTokenVerifierError > {
230232 match provider {
231233 OidcProvider :: Google => {
232234 verifier
233- . verify_token ( & OidcToken :: Google { token } , public_key)
235+ . verify_token ( & OidcToken :: Google { token } , public_key, client_name )
234236 . await
235237 }
236238 OidcProvider :: Apple => {
237239 verifier
238- . verify_token ( & OidcToken :: Apple { token } , public_key)
240+ . verify_token ( & OidcToken :: Apple { token } , public_key, client_name )
239241 . await
240242 }
241243 }
@@ -257,8 +259,14 @@ mod tests {
257259 let token = oidc_server. generate_token ( provider. into ( ) , None , & public_key) ;
258260
259261 // Verify the token
260- let result =
261- verify_token_for_provider ( & verifier, provider, token, public_key. clone ( ) ) . await ;
262+ let result = verify_token_for_provider (
263+ & verifier,
264+ provider,
265+ token,
266+ public_key. clone ( ) ,
267+ Some ( "ios-id" ) ,
268+ )
269+ . await ;
262270
263271 // The test should pass with a valid token
264272 assert ! ( result. is_ok( ) ) ;
@@ -281,8 +289,14 @@ mod tests {
281289 let token = oidc_server. generate_expired_token ( provider. into ( ) ) ;
282290
283291 // Verify the token
284- let result =
285- verify_token_for_provider ( & verifier, provider, token, public_key. clone ( ) ) . await ;
292+ let result = verify_token_for_provider (
293+ & verifier,
294+ provider,
295+ token,
296+ public_key. clone ( ) ,
297+ Some ( "ios-id" ) ,
298+ )
299+ . await ;
286300
287301 // The test should fail with an expired token
288302 assert ! ( result. is_err( ) ) ;
@@ -309,8 +323,14 @@ mod tests {
309323 let token = oidc_server. generate_incorrectly_signed_token ( provider. into ( ) ) ;
310324
311325 // Verify the token
312- let result =
313- verify_token_for_provider ( & verifier, provider, token, public_key. clone ( ) ) . await ;
326+ let result = verify_token_for_provider (
327+ & verifier,
328+ provider,
329+ token,
330+ public_key. clone ( ) ,
331+ Some ( "ios-id" ) ,
332+ )
333+ . await ;
314334
315335 // The test should fail with an incorrectly signed token
316336 assert ! ( result. is_err( ) ) ;
@@ -338,8 +358,14 @@ mod tests {
338358 oidc_server. generate_token_with_incorrect_issuer ( provider. into ( ) , & public_key) ;
339359
340360 // Verify the token
341- let result =
342- verify_token_for_provider ( & verifier, provider, token, public_key. clone ( ) ) . await ;
361+ let result = verify_token_for_provider (
362+ & verifier,
363+ provider,
364+ token,
365+ public_key. clone ( ) ,
366+ Some ( "ios-id" ) ,
367+ )
368+ . await ;
343369
344370 // The test should fail with an incorrect issuer
345371 assert ! ( result. is_err( ) ) ;
@@ -367,8 +393,14 @@ mod tests {
367393 oidc_server. generate_token_with_incorrect_audience ( provider. into ( ) , & public_key) ;
368394
369395 // Verify the token
370- let result =
371- verify_token_for_provider ( & verifier, provider, token, public_key. clone ( ) ) . await ;
396+ let result = verify_token_for_provider (
397+ & verifier,
398+ provider,
399+ token,
400+ public_key. clone ( ) ,
401+ Some ( "ios-id" ) ,
402+ )
403+ . await ;
372404
373405 // The test should fail with an incorrect audience
374406 assert ! ( result. is_err( ) ) ;
@@ -396,8 +428,14 @@ mod tests {
396428 oidc_server. generate_token_with_incorrect_issued_at ( provider. into ( ) , & public_key) ;
397429
398430 // Verify the token
399- let result =
400- verify_token_for_provider ( & verifier, provider, token, public_key. clone ( ) ) . await ;
431+ let result = verify_token_for_provider (
432+ & verifier,
433+ provider,
434+ token,
435+ public_key. clone ( ) ,
436+ Some ( "ios-id" ) ,
437+ )
438+ . await ;
401439
402440 // The test should fail with an incorrect issued_at
403441 assert ! ( result. is_err( ) ) ;
@@ -431,9 +469,14 @@ mod tests {
431469 let token = oidc_server. generate_token ( provider. into ( ) , None , & correct_public_key) ;
432470
433471 // Verify the token but pass a different public key
434- let result =
435- verify_token_for_provider ( & verifier, provider, token, incorrect_public_key. clone ( ) )
436- . await ;
472+ let result = verify_token_for_provider (
473+ & verifier,
474+ provider,
475+ token,
476+ incorrect_public_key. clone ( ) ,
477+ Some ( "ios-id" ) ,
478+ )
479+ . await ;
437480
438481 // The test should fail with an incorrect public key
439482 assert ! ( result. is_err( ) ) ;
@@ -460,6 +503,7 @@ mod tests {
460503 OidcProvider :: Google ,
461504 token. clone ( ) ,
462505 public_key. clone ( ) ,
506+ None ,
463507 )
464508 . await
465509 . unwrap ( ) ; // The first time is successful
@@ -470,6 +514,7 @@ mod tests {
470514 OidcProvider :: Google ,
471515 token. clone ( ) ,
472516 public_key. clone ( ) ,
517+ None ,
473518 )
474519 . await ;
475520 assert ! ( result. is_err( ) ) ;
@@ -484,9 +529,14 @@ mod tests {
484529 let new_token = oidc_server. generate_token ( OidcProvider :: Google . into ( ) , None , & public_key) ;
485530
486531 assert_ne ! ( token, new_token) ;
487- let result =
488- verify_token_for_provider ( & verifier, OidcProvider :: Google , token, public_key. clone ( ) )
489- . await ;
532+ let result = verify_token_for_provider (
533+ & verifier,
534+ OidcProvider :: Google ,
535+ token,
536+ public_key. clone ( ) ,
537+ None ,
538+ )
539+ . await ;
490540 assert ! ( result. is_err( ) ) ;
491541 assert ! ( matches!(
492542 result,
0 commit comments