use async_trait::async_trait;
use jsonwebtoken::jwk::JwkSet;
use crate::error::Result;
#[async_trait]
pub trait MetadataFetcher: Send + Sync {
async fn resolve_jwks_uri(&self, iss: &str, dwk: &str) -> Result<String>;
async fn fetch_jwks(&self, jwks_uri: &str) -> Result<JwkSet>;
}
#[derive(Clone)]
pub struct StaticMetadataFetcher {
jwks_uri: String,
jwks: JwkSet,
}
impl StaticMetadataFetcher {
pub fn new(jwks_uri: impl Into<String>, jwks: JwkSet) -> Self {
Self {
jwks_uri: jwks_uri.into(),
jwks,
}
}
}
#[async_trait]
impl MetadataFetcher for StaticMetadataFetcher {
async fn resolve_jwks_uri(&self, _iss: &str, _dwk: &str) -> Result<String> {
Ok(self.jwks_uri.clone())
}
async fn fetch_jwks(&self, jwks_uri: &str) -> Result<JwkSet> {
if jwks_uri == self.jwks_uri {
Ok(self.jwks.clone())
} else {
Err(crate::error::AAuthError::Token {
code: "metadata_fetch_failed".into(),
message: format!("unknown JWKS URI: {jwks_uri}"),
})
}
}
}