use crate::cognito::config::VerifierConfig;
use crate::common::error::JwtError;
use crate::oidc::OidcProviderConfig;
use crate::verifier::{JwtVerifier, IdTokenClaims, AccessTokenClaims};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum VerifierType {
Cognito,
Oidc,
}
#[derive(Debug)]
pub enum JwtVerifierEnum {
Cognito(crate::cognito::CognitoJwtVerifier),
Oidc(crate::oidc::OidcJwtVerifier),
}
impl JwtVerifier for JwtVerifierEnum {
async fn verify_id_token(&self, token: &str) -> Result<Box<dyn IdTokenClaims>, JwtError> {
match self {
JwtVerifierEnum::Cognito(verifier) => verifier.verify_id_token(token).await,
JwtVerifierEnum::Oidc(verifier) => verifier.verify_id_token(token).await,
}
}
async fn verify_access_token(
&self,
token: &str,
) -> Result<Box<dyn AccessTokenClaims>, JwtError> {
match self {
JwtVerifierEnum::Cognito(verifier) => verifier.verify_access_token(token).await,
JwtVerifierEnum::Oidc(verifier) => verifier.verify_access_token(token).await,
}
}
}
pub struct VerifierFactory;
impl VerifierFactory {
pub fn create(
verifier_type: VerifierType,
config: VerifierConfig,
) -> Result<JwtVerifierEnum, JwtError> {
match verifier_type {
VerifierType::Cognito => Self::create_cognito(config),
VerifierType::Oidc => Err(JwtError::ConfigurationError {
parameter: Some("verifier_type".to_string()),
error: "Cannot create OIDC verifier from Cognito config. Use create_oidc instead."
.to_string(),
}),
}
}
pub fn create_cognito(config: VerifierConfig) -> Result<JwtVerifierEnum, JwtError> {
let verifier = crate::cognito::CognitoJwtVerifier::new(vec![config])?;
Ok(JwtVerifierEnum::Cognito(verifier))
}
pub fn create_oidc(configs: Vec<OidcProviderConfig>) -> Result<JwtVerifierEnum, JwtError> {
let verifier = crate::oidc::OidcJwtVerifier::new(configs)?;
Ok(JwtVerifierEnum::Oidc(verifier))
}
}