Skip to content

Commit a9693c8

Browse files
committed
Simplify credentials getter and just add new provider error for dupe keys
1 parent a27ccba commit a9693c8

File tree

1 file changed

+34
-57
lines changed
  • crates/handlers/src/upstream_oauth2

1 file changed

+34
-57
lines changed

crates/handlers/src/upstream_oauth2/mod.rs

Lines changed: 34 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
7667
pub 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

Comments
 (0)