use crate::api_key::{ApiKeyAuthProvider, parse_key_ring};
use crate::multi::MultiAuthProvider;
use crate::oidc::{OidcAuthProvider, OidcConfig};
use crate::types::AuthProvider;
use micromegas_tracing::info;
use std::sync::Arc;
pub async fn provider() -> anyhow::Result<Option<Arc<dyn AuthProvider>>> {
let api_key_provider = match std::env::var("MICROMEGAS_API_KEYS") {
Ok(keys_json) => {
let keyring = parse_key_ring(&keys_json)?;
info!("API key authentication enabled");
Some(Arc::new(ApiKeyAuthProvider::new(keyring)) as Arc<dyn AuthProvider>)
}
Err(_) => {
info!("MICROMEGAS_API_KEYS not set - API key auth disabled");
None
}
};
let oidc_provider = match OidcConfig::from_env() {
Ok(config) => {
info!("Initializing OIDC authentication");
Some(Arc::new(OidcAuthProvider::new(config).await?) as Arc<dyn AuthProvider>)
}
Err(e) => {
info!("OIDC not configured ({e}) - OIDC auth disabled");
None
}
};
let mut multi = MultiAuthProvider::new();
if let Some(provider) = api_key_provider {
multi = multi.with_provider(provider);
}
if let Some(provider) = oidc_provider {
multi = multi.with_provider(provider);
}
if multi.is_empty() {
return Ok(None);
}
Ok(Some(Arc::new(multi) as Arc<dyn AuthProvider>))
}