systemprompt_security/jwt/
mod.rs1use anyhow::Result;
2use chrono::{Duration, Utc};
3use jsonwebtoken::{encode, Algorithm, EncodingKey, Header};
4use systemprompt_identifiers::{JwtToken, SessionId, UserId};
5use systemprompt_models::auth::{
6 JwtAudience, JwtClaims, Permission, RateLimitTier, TokenType, UserType,
7};
8
9#[derive(Debug)]
10pub struct AdminTokenParams<'a> {
11 pub user_id: &'a UserId,
12 pub session_id: &'a SessionId,
13 pub email: &'a str,
14 pub jwt_secret: &'a str,
15 pub issuer: &'a str,
16 pub duration: Duration,
17}
18
19#[derive(Copy, Clone, Debug)]
20pub struct JwtService;
21
22impl JwtService {
23 pub fn generate_admin_token(params: &AdminTokenParams<'_>) -> Result<JwtToken> {
24 let now = Utc::now();
25 let expiry = now + params.duration;
26
27 let claims = JwtClaims {
28 sub: params.user_id.to_string(),
29 iat: now.timestamp(),
30 exp: expiry.timestamp(),
31 iss: params.issuer.to_string(),
32 aud: JwtAudience::standard(),
33 jti: uuid::Uuid::new_v4().to_string(),
34 scope: vec![Permission::Admin],
35 username: params.email.to_string(),
36 email: params.email.to_string(),
37 user_type: UserType::Admin,
38 roles: vec!["admin".to_string(), "user".to_string()],
39 client_id: Some("sp_tui".to_string()),
40 token_type: TokenType::Bearer,
41 auth_time: now.timestamp(),
42 session_id: Some(params.session_id.to_string()),
43 rate_limit_tier: Some(RateLimitTier::Admin),
44 };
45
46 let header = Header::new(Algorithm::HS256);
47 let token = encode(
48 &header,
49 &claims,
50 &EncodingKey::from_secret(params.jwt_secret.as_bytes()),
51 )?;
52
53 Ok(JwtToken::new(token))
54 }
55}