use std::env;
use std::fmt::Debug;
use reqwest_middleware::ClientWithMiddleware as Client;
use tracing::debug;
use url::Url;
use super::jwt_bearer;
use crate::{CredentialResult, Token};
#[derive(Debug)]
pub struct ModalAuthProvider {
client: Client,
token_endpoint: Url,
workload_id: String,
}
impl ModalAuthProvider {
pub fn new(client: impl Into<Client>, token_endpoint: Url, workload_id: String) -> Self {
ModalAuthProvider {
client: client.into(),
token_endpoint,
workload_id,
}
}
}
impl ModalAuthProvider {
pub async fn token(&self) -> CredentialResult<Option<Token>> {
let Some(modal_token) = env::var("MODAL_IDENTITY_TOKEN").ok() else {
return Ok(None);
};
let token = jwt_bearer(
&self.client,
&self.token_endpoint,
self.workload_id.clone(),
modal_token,
None,
)
.await?;
debug!("ModalAuthProvider obtained a workload token");
Ok(Some(token))
}
}
impl_token_source!(ModalAuthProvider);