edc_dataplane_proxy/web/api/
jwks.rs

1use axum::{extract::State, http::StatusCode, response::IntoResponse, Json};
2use jsonwebtoken::jwk::JwkSet;
3use serde_json::json;
4
5use crate::{
6    service::token::{TokenError, TokenManager},
7    web::state::Context,
8};
9
10pub async fn jwks<T: TokenManager + Clone>(
11    State(ctx): State<Context<T>>,
12) -> Result<Json<JwkSet>, JwkError> {
13    ctx.tokens().keys().map_err(JwkError::Token).map(Json)
14}
15
16pub enum JwkError {
17    Token(TokenError),
18}
19
20impl IntoResponse for JwkError {
21    fn into_response(self) -> axum::response::Response {
22        let (status, error_message) = match self {
23            JwkError::Token(_e) => (StatusCode::BAD_GATEWAY, "Bad gateway"),
24        };
25        let body = Json(json!({
26            "error": error_message,
27        }));
28        (status, body).into_response()
29    }
30}