use actix_web::HttpRequest;
#[cfg(feature = "cylinder-jwt")]
use cylinder::Verifier;
#[cfg(feature = "biome-credentials")]
use crate::biome::credentials::rest_api::BiomeCredentialsRestResourceProvider;
#[cfg(feature = "oauth")]
use crate::biome::OAuthUserSessionStore;
#[cfg(all(feature = "oauth", feature = "biome-profile"))]
use crate::biome::UserProfileStore;
#[cfg(feature = "oauth")]
use crate::rest_api::OAuthConfig;
use crate::rest_api::{auth::identity::IdentityProvider, RequestError};
use super::Resource;
pub enum AuthConfig {
#[cfg(feature = "biome-credentials")]
Biome {
biome_credentials_resource_provider: BiomeCredentialsRestResourceProvider,
},
#[cfg(feature = "cylinder-jwt")]
Cylinder {
verifier: Box<dyn Verifier>,
},
#[cfg(feature = "oauth")]
OAuth {
oauth_config: OAuthConfig,
oauth_user_session_store: Box<dyn OAuthUserSessionStore>,
#[cfg(feature = "biome-profile")]
user_profile_store: Box<dyn UserProfileStore>,
},
Custom {
resources: Vec<Resource>,
identity_provider: Box<dyn IdentityProvider>,
},
}
pub fn require_header(header_key: &str, request: &HttpRequest) -> Result<String, RequestError> {
let header = request.headers().get(header_key).ok_or_else(|| {
RequestError::MissingHeader(format!("Header {} not included in Request", header_key))
})?;
Ok(header
.to_str()
.map_err(|err| RequestError::InvalidHeaderValue(format!("Invalid header value: {}", err)))?
.to_string())
}
pub fn get_authorization_token(request: &HttpRequest) -> Result<String, RequestError> {
let auth_header = require_header("Authorization", request)?;
Ok(auth_header
.split_whitespace()
.last()
.ok_or_else(|| {
RequestError::InvalidHeaderValue(
"Authorization token not included in request".to_string(),
)
})?
.to_string())
}