@@ -32,6 +32,9 @@ enum ProviderCredentialsError {
3232 #[ error( "Provider doesn't have a client secret" ) ]
3333 MissingClientSecret ,
3434
35+ #[ error( "Duplicate private key and private key file for Sign in with Apple" ) ]
36+ DuplicatePrivateKey ,
37+
3538 #[ error( "Missing private key for signing the id_token" ) ]
3639 MissingPrivateKey ,
3740
@@ -60,18 +63,6 @@ enum ProviderCredentialsError {
6063 } ,
6164}
6265
63- #[ derive( Debug , Error ) ]
64- enum AppleCredentialsError {
65- #[ error( "Missing private key for signing the id_token" ) ]
66- MissingPrivateKey ,
67-
68- #[ error( "Duplicate private key for signing the id_token" ) ]
69- DuplicatePrivateKey ,
70-
71- #[ error( transparent) ]
72- InvalidPrivateKey ( #[ from] pkcs8:: Error ) ,
73- }
74-
7566#[ derive( Debug , Deserialize , JsonSchema ) ]
7667pub struct SignInWithApple {
7768 /// The private key file used to sign the `id_token`
@@ -152,53 +143,39 @@ async fn client_credentials_for_provider(
152143
153144 UpstreamOAuthProviderTokenAuthMethod :: SignInWithApple => {
154145 let client_secret = client_secret. ok_or ( ProviderCredentialsError :: MissingClientSecret ) ?;
155-
156- resolve_apple_credentials ( client_id, client_secret)
157- . await
158- . map_err ( |err| {
159- match err {
160- AppleCredentialsError :: MissingPrivateKey => ProviderCredentialsError :: MissingPrivateKey ,
161- AppleCredentialsError :: DuplicatePrivateKey => ProviderCredentialsError :: MissingPrivateKey , // maybe define a better one later
162- AppleCredentialsError :: InvalidPrivateKey ( inner) => ProviderCredentialsError :: InvalidPrivateKey { inner } ,
163- }
164- } ) ?
146+
147+ let params: SignInWithApple = serde_json:: from_str ( & client_secret)
148+ . map_err ( |inner| ProviderCredentialsError :: InvalidClientSecretJson { inner } ) ?;
149+
150+ if params. private_key . is_none ( ) && params. private_key_file . is_none ( ) {
151+ return Err ( ProviderCredentialsError :: MissingPrivateKey ) ;
152+ }
153+
154+ if params. private_key . is_some ( ) && params. private_key_file . is_some ( ) {
155+ return Err ( ProviderCredentialsError :: DuplicatePrivateKey ) ;
156+ }
157+
158+ let private_key_pem = if let Some ( private_key) = params. private_key {
159+ private_key
160+ } else if let Some ( private_key_file) = params. private_key_file {
161+ tokio:: fs:: read_to_string ( private_key_file)
162+ . await
163+ . map_err ( |_| ProviderCredentialsError :: MissingPrivateKey ) ?
164+ } else {
165+ unreachable ! ( "already validated above" )
166+ } ;
167+
168+ let key = elliptic_curve:: SecretKey :: from_pkcs8_pem ( & private_key_pem)
169+ . map_err ( |inner| ProviderCredentialsError :: InvalidPrivateKey { inner } ) ?;
170+
171+ ClientCredentials :: SignInWithApple {
172+ client_id,
173+ key,
174+ key_id : params. key_id ,
175+ team_id : params. team_id ,
176+ }
165177 }
166178 } ;
167179
168180 Ok ( client_credentials)
169181}
170-
171- async fn resolve_apple_credentials (
172- client_id : String ,
173- client_secret : String ,
174- ) -> Result < ClientCredentials , AppleCredentialsError > {
175- let params: SignInWithApple = serde_json:: from_str ( & client_secret)
176- . map_err ( |_| AppleCredentialsError :: MissingPrivateKey ) ?;
177-
178- if params. private_key . is_none ( ) && params. private_key_file . is_none ( ) {
179- return Err ( AppleCredentialsError :: MissingPrivateKey ) ;
180- }
181-
182- if params. private_key . is_some ( ) && params. private_key_file . is_some ( ) {
183- return Err ( AppleCredentialsError :: DuplicatePrivateKey ) ;
184- }
185-
186- let private_key_pem = if let Some ( private_key) = params. private_key {
187- private_key
188- } else if let Some ( private_key_file) = params. private_key_file {
189- tokio:: fs:: read_to_string ( private_key_file)
190- . await
191- . map_err ( |_| AppleCredentialsError :: MissingPrivateKey ) ?
192- } else {
193- unreachable ! ( "already validated" )
194- } ;
195-
196- let key = elliptic_curve:: SecretKey :: from_pkcs8_pem ( & private_key_pem) ?;
197-
198- Ok ( ClientCredentials :: SignInWithApple {
199- client_id,
200- key,
201- key_id : params. key_id ,
202- team_id : params. team_id ,
203- } )
204- }
0 commit comments