mirror of
https://github.com/BerriAI/litellm.git
synced 2026-11-14 09:03:16 +00:00
* fix(auth): align cloud credential loading and expiry with the Python SDKs * feat(auth): resolve consumer-scoped default identities for AWS and Azure AwsAuthService::default_chain_credentials and AzureAuthService::identity_token give a consumer the SDK's own default identity without LiteLLM's Bedrock or Azure OpenAI settings. Moved here from #49510 so every shared auth crate change lives in one PR Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(auth): include identity hints in secret snapshots --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
47 lines
1.4 KiB
Rust
47 lines
1.4 KiB
Rust
use std::{future::Future, pin::Pin};
|
|
|
|
use litellm_auth_gcp::{CredentialSource, GcpAuth};
|
|
use litellm_secret_value::SecretValue;
|
|
|
|
use litellm_cache::Error;
|
|
|
|
pub trait TokenSource: Send + Sync + 'static {
|
|
fn bearer_token(&self) -> Pin<Box<dyn Future<Output = Result<String, Error>> + Send + '_>>;
|
|
}
|
|
|
|
pub struct GcsTokenSource {
|
|
auth: GcpAuth,
|
|
credentials: Option<String>,
|
|
}
|
|
|
|
impl GcsTokenSource {
|
|
pub fn new(path_service_account: Option<String>) -> Self {
|
|
Self {
|
|
auth: GcpAuth::default(),
|
|
credentials: path_service_account.filter(|path| !path.trim().is_empty()),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl TokenSource for GcsTokenSource {
|
|
fn bearer_token(&self) -> Pin<Box<dyn Future<Output = Result<String, Error>> + Send + '_>> {
|
|
Box::pin(async move {
|
|
self.auth
|
|
.access_token(match &self.credentials {
|
|
Some(path) => CredentialSource::Trusted(SecretValue::new(path.clone())),
|
|
None => CredentialSource::application_default(&|name| std::env::var(name).ok()),
|
|
})
|
|
.await
|
|
.map(|token| token.expose().to_owned())
|
|
.map_err(Error::unavailable)
|
|
})
|
|
}
|
|
}
|
|
|
|
pub struct StaticTokenSource(pub String);
|
|
|
|
impl TokenSource for StaticTokenSource {
|
|
fn bearer_token(&self) -> Pin<Box<dyn Future<Output = Result<String, Error>> + Send + '_>> {
|
|
Box::pin(async move { Ok(self.0.clone()) })
|
|
}
|
|
}
|