use serde_json::{Map, Value};
#[derive(Debug, Clone)]
pub struct LocalIdpMetadata {
pub issuer: String,
pub jwks_uri: String,
pub id_token_signing_alg_values_supported: Vec<String>,
pub extra: Vec<(String, Value)>,
}
impl LocalIdpMetadata {
pub fn to_json(&self) -> Value {
let mut obj = Map::new();
obj.insert("issuer".to_string(), Value::String(self.issuer.clone()));
obj.insert("jwks_uri".to_string(), Value::String(self.jwks_uri.clone()));
obj.insert(
"id_token_signing_alg_values_supported".to_string(),
Value::Array(
self.id_token_signing_alg_values_supported
.iter()
.map(|s| Value::String(s.clone()))
.collect(),
),
);
for (k, v) in &self.extra {
obj.insert(k.clone(), v.clone());
}
Value::Object(obj)
}
pub fn to_json_string(&self) -> String {
serde_json::to_string(&self.to_json())
.expect("LocalIdpMetadata JSON serialisation always succeeds")
}
}
pub mod handlers {
use crate::local_idp::{LocalIdp, LocalIdpKeyStore};
use axum::extract::State;
use axum::response::Json;
use jsonwebtoken::jwk::JwkSet;
pub async fn openid_configuration<K: LocalIdpKeyStore + 'static>(
State(idp): State<LocalIdp<K>>,
) -> Json<serde_json::Value> {
Json(idp.metadata().await.to_json())
}
pub async fn jwks<K: LocalIdpKeyStore + 'static>(
State(idp): State<LocalIdp<K>>,
) -> Json<JwkSet> {
Json(idp.jwks().await)
}
}