Skip to content
Clone
194c44c
52 lines 1.3 KB Rust
use axum::extract::{Query, State};
use axum::response::Json;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use crate::errors::ApiError;
use crate::services::AuthService;
use jwt::Session;
use jwt::share::session::require_uid;
#[derive(Debug, Deserialize)]
pub struct JwtRequestQuery {
#[serde(default)]
pub appid: Option<String>,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct JwtRequestResp {
pub jwt: String,
pub expires_in_secs: i64,
}
pub async fn jwt_request(
State(service): State<AuthService>,
session: Session,
Query(query): Query<JwtRequestQuery>,
) -> Result<Json<JwtRequestResp>, ApiError> {
let uid = require_uid(&session)?;
let appid = query.appid.as_deref().unwrap_or("chat");
if appid != "chat" {
return Err(ApiError::bad_request("unsupported appid"));
}
let client = service
.state
.kenauth
.as_ref()
.ok_or_else(|| ApiError::internal("kenoauth client is not configured"))?;
let issued = client
.issue_service_token(
uid,
2,
vec![8, 9],
900,
&uuid::Uuid::now_v7().to_string(),
)
.await
.map_err(|error| ApiError::internal(error.to_string()))?;
Ok(Json(JwtRequestResp {
jwt: issued.service_token,
expires_in_secs: 900,
}))
}