Skip to main content

systemprompt_api/services/middleware/jwt/
params.rs

1//! JWT middleware construction parameters.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use axum::http::HeaderMap;
7use systemprompt_identifiers::{
8    Actor, AgentName, ContextId, JwtToken, SessionId, TaskId, TraceId, UserId,
9};
10use systemprompt_models::auth::UserType;
11use systemprompt_models::execution::context::RequestContext;
12use systemprompt_security::{HeaderExtractor, JwtUserContext, TokenExtractor};
13
14#[derive(Debug)]
15pub struct BuildContextParams {
16    pub jwt_context: JwtUserContext,
17    pub session_id: SessionId,
18    pub user_id: UserId,
19    pub trace_id: TraceId,
20    pub context_id: ContextId,
21    pub agent_name: AgentName,
22    pub task_id: Option<TaskId>,
23    pub auth_token: Option<String>,
24    pub user_type: UserType,
25}
26
27pub fn build_context(params: BuildContextParams) -> RequestContext {
28    let BuildContextParams {
29        jwt_context,
30        session_id,
31        user_id,
32        trace_id,
33        context_id,
34        agent_name,
35        task_id,
36        auth_token,
37        user_type,
38    } = params;
39    let mut ctx = RequestContext::new(
40        session_id,
41        trace_id,
42        context_id,
43        agent_name,
44        Actor::user(user_id),
45    )
46    .with_user_type(user_type)
47    .with_act_chain(jwt_context.act_chain)
48    .with_token_exp(jwt_context.exp);
49
50    if let Some(jti) = jwt_context.jti {
51        ctx = ctx.with_jti(jti);
52    }
53    if let Some(client_id) = jwt_context.client_id {
54        ctx = ctx.with_client_id(client_id);
55    }
56    if let Some(t_id) = task_id {
57        ctx = ctx.with_task_id(t_id);
58    }
59    if let Some(token) = auth_token.filter(|token| !token.is_empty()) {
60        ctx = ctx.with_auth_token(JwtToken::new(token));
61    }
62    ctx
63}
64
65pub fn extract_common_headers(
66    token_extractor: &TokenExtractor,
67    headers: &HeaderMap,
68) -> (TraceId, Option<TaskId>, Option<String>, AgentName) {
69    (
70        HeaderExtractor::extract_trace_id(headers),
71        HeaderExtractor::extract_task_id(headers),
72        token_extractor.extract(headers).ok(),
73        HeaderExtractor::extract_agent_name(headers),
74    )
75}