this repo has no description
1use crate::api::ApiError;
2use crate::state::AppState;
3use axum::{
4 Json,
5 extract::{Query, State},
6 http::StatusCode,
7 response::{IntoResponse, Response},
8};
9use serde::{Deserialize, Serialize};
10use serde_json::json;
11use tracing::error;
12#[derive(Deserialize)]
13pub struct GetServiceAuthParams {
14 pub aud: String,
15 pub lxm: Option<String>,
16 pub exp: Option<i64>,
17}
18#[derive(Serialize)]
19pub struct GetServiceAuthOutput {
20 pub token: String,
21}
22pub async fn get_service_auth(
23 State(state): State<AppState>,
24 headers: axum::http::HeaderMap,
25 Query(params): Query<GetServiceAuthParams>,
26) -> Response {
27 let token = match crate::auth::extract_bearer_token_from_header(
28 headers.get("Authorization").and_then(|h| h.to_str().ok())
29 ) {
30 Some(t) => t,
31 None => return ApiError::AuthenticationRequired.into_response(),
32 };
33 let auth_user = match crate::auth::validate_bearer_token(&state.db, &token).await {
34 Ok(user) => user,
35 Err(e) => return ApiError::from(e).into_response(),
36 };
37 let key_bytes = match auth_user.key_bytes {
38 Some(kb) => kb,
39 None => return ApiError::AuthenticationFailedMsg("OAuth tokens cannot create service auth".into()).into_response(),
40 };
41 let lxm = params.lxm.as_deref().unwrap_or("*");
42 let service_token = match crate::auth::create_service_token(&auth_user.did, ¶ms.aud, lxm, &key_bytes)
43 {
44 Ok(t) => t,
45 Err(e) => {
46 error!("Failed to create service token: {:?}", e);
47 return (
48 StatusCode::INTERNAL_SERVER_ERROR,
49 Json(json!({"error": "InternalError"})),
50 )
51 .into_response();
52 }
53 };
54 (StatusCode::OK, Json(GetServiceAuthOutput { token: service_token })).into_response()
55}