use crate::error::FastMCPError;
use crate::mcp::types::JsonRpcRequest;
use crate::server::auth::oidc::OIDCProvider;
use crate::server::auth::{AuthContext, AuthProvider};
use async_trait::async_trait;
use std::env;
pub struct OCIProvider {
inner: OIDCProvider,
#[allow(dead_code)]
base_url: String,
}
impl OCIProvider {
pub async fn new(
issuer_url: &str,
client_id: &str,
base_url: &str,
) -> Result<Self, FastMCPError> {
let issuer = issuer_url.trim_end_matches('/');
let inner = OIDCProvider::new(issuer, client_id)
.await
.map_err(|e| FastMCPError::new(format!("Failed to initialize OCI provider: {}", e)))?;
Ok(Self {
inner,
base_url: base_url.to_string(),
})
}
pub async fn from_env() -> Result<Self, FastMCPError> {
let issuer_url = env::var("OXFASTMCP_SERVER_AUTH_OCI_ISSUER_URL")
.or_else(|_| env::var("OXFASTMCP_SERVER_AUTH_OCI_CONFIG_URL").map(|s| s.replace("/.well-known/openid-configuration", "")))
.map_err(|_| FastMCPError::new("Missing OXFASTMCP_SERVER_AUTH_OCI_ISSUER_URL or OXFASTMCP_SERVER_AUTH_OCI_CONFIG_URL".to_string()))?;
let client_id = env::var("OXFASTMCP_SERVER_AUTH_OCI_CLIENT_ID").map_err(|_| {
FastMCPError::new("Missing OXFASTMCP_SERVER_AUTH_OCI_CLIENT_ID".to_string())
})?;
let base_url = env::var("OXFASTMCP_SERVER_AUTH_OCI_BASE_URL").map_err(|_| {
FastMCPError::new("Missing OXFASTMCP_SERVER_AUTH_OCI_BASE_URL".to_string())
})?;
Self::new(&issuer_url, &client_id, &base_url).await
}
}
#[async_trait]
impl AuthProvider for OCIProvider {
async fn verify(&self, request: &JsonRpcRequest) -> Result<AuthContext, FastMCPError> {
self.inner.verify(request).await
}
}