mz_frontegg_mock/
utils.rs
1use crate::models::{ApiToken, AuthUserRequest, UserRole};
11use crate::server::Context;
12use jsonwebtoken::TokenData;
13use mz_frontegg_auth::{ClaimMetadata, ClaimTokenType, Claims};
14use std::collections::BTreeMap;
15use uuid::Uuid;
16
17pub fn decode_access_token(
18 context: &Context,
19 token: &str,
20) -> Result<TokenData<Claims>, jsonwebtoken::errors::Error> {
21 jsonwebtoken::decode(
22 token,
23 &context.decoding_key,
24 &jsonwebtoken::Validation::new(jsonwebtoken::Algorithm::RS256),
25 )
26}
27
28pub fn generate_access_token(
29 context: &Context,
30 token_type: ClaimTokenType,
31 sub: Uuid,
32 email: Option<String>,
33 user_id: Option<Uuid>,
34 tenant_id: Uuid,
35 roles: Vec<String>,
36 metadata: Option<ClaimMetadata>,
37) -> String {
38 let mut permissions = Vec::new();
39 roles.iter().for_each(|role| {
40 if let Some(role_permissions) = context.role_permissions.get(role.as_str()) {
41 permissions.extend_from_slice(role_permissions);
42 }
43 });
44 permissions.sort();
45 permissions.dedup();
46 jsonwebtoken::encode(
47 &jsonwebtoken::Header::new(jsonwebtoken::Algorithm::RS256),
48 &Claims {
49 token_type,
50 exp: context.now.as_secs() + context.expires_in_secs,
51 email,
52 iss: context.issuer.clone(),
53 sub,
54 user_id,
55 tenant_id,
56 roles,
57 permissions,
58 metadata,
59 },
60 &context.encoding_key,
61 )
62 .unwrap()
63}
64
65pub fn generate_refresh_token(context: &Context, target: RefreshTokenTarget) -> String {
66 let refresh_token = Uuid::new_v4().to_string();
67 context
68 .refresh_tokens
69 .lock()
70 .unwrap()
71 .insert(refresh_token.clone(), target);
72 refresh_token
73}
74
75pub fn get_user_roles(
76 role_ids_or_names: &[String],
77 role_mapping: &BTreeMap<String, UserRole>,
78) -> Vec<UserRole> {
79 role_ids_or_names
80 .iter()
81 .map(|id_or_name| {
82 role_mapping
83 .get(id_or_name)
84 .cloned()
85 .unwrap_or_else(|| UserRole {
86 id: id_or_name.clone(),
87 name: id_or_name.clone(),
88 key: id_or_name.clone(),
89 })
90 })
91 .collect()
92}
93
94pub enum RefreshTokenTarget {
95 User(AuthUserRequest),
96 ApiToken(ApiToken),
97}