use std::sync::Arc;
use async_trait::async_trait;
use rvoip_core_traits::identity::{IdentityAssurance, Jwk};
use thiserror::Error;
#[derive(Debug, Error)]
pub enum BearerAuthError {
#[error("empty bearer token")]
Empty,
#[error("invalid bearer token: {0}")]
Invalid(String),
#[error("validator unavailable: {0}")]
Unavailable(String),
}
#[async_trait]
pub trait BearerValidator: Send + Sync {
async fn validate(&self, token: &str) -> Result<IdentityAssurance, BearerAuthError>;
}
pub fn bearer_stub() -> Arc<dyn BearerValidator> {
Arc::new(StubBearerValidator)
}
struct StubBearerValidator;
#[async_trait]
impl BearerValidator for StubBearerValidator {
async fn validate(&self, token: &str) -> Result<IdentityAssurance, BearerAuthError> {
if token.is_empty() {
return Err(BearerAuthError::Empty);
}
let ephemeral_key = Jwk(serde_json::json!({
"kty": "stub",
"kid": uuid::Uuid::new_v4().simple().to_string(),
}));
Ok(IdentityAssurance::Pseudonymous { ephemeral_key })
}
}