mapkitjs_token_gen/
lib.rs

1extern crate jsonwebtoken;
2extern crate serde;
3
4mod tests;
5
6use jsonwebtoken::{encode, Algorithm, Header, EncodingKey};
7use serde::{Serialize, Deserialize};
8use std::fs;
9
10#[derive(Debug, Serialize, Deserialize)]
11pub enum TokenType {
12   JWT 
13}
14
15#[derive(Debug, Serialize, Deserialize)]
16pub struct TokenHeader {
17    kid: Option<String>,
18    typ: TokenType,
19}
20
21impl TokenHeader {
22    pub fn new(kid: &str, typ: TokenType) -> Self {
23        TokenHeader { 
24            kid: Option::Some(kid.to_string()), 
25            typ,
26        }
27    }
28
29    pub fn new_with_key_id(key_id: &str, typ: TokenType) -> Self {
30        TokenHeader::new(key_id, typ)
31    }
32
33    pub fn typ_to_value(&self) -> Option<String>{
34        let value = match self.typ {
35            TokenType::JWT => "JWT".to_string(),
36        };
37        Option::Some(value)
38    }
39}
40
41#[derive(Debug, Serialize, Deserialize)]
42pub struct TokenPayload{
43    iss: String,
44    iat: i64,
45    exp: i64,
46    origin: String,
47}
48
49impl TokenPayload{
50    pub fn new(
51        iss: &str,
52        iat: i64,
53        exp: i64,
54        origin: &str 
55    ) -> Self {
56        TokenPayload { 
57            iss: iss.to_string(),
58            iat,
59            exp,
60            origin: origin.to_string(),
61        }
62    }
63
64    pub fn new_with(
65        team_id: &str, 
66        created_at: i64, 
67        expires_at: i64,
68        origin: &str
69    ) -> Self {
70        TokenPayload::new(team_id, created_at, expires_at, origin)
71    }
72}
73
74pub fn generate_with_filepath(
75    filepath: &str,
76    header: TokenHeader,
77    payload: TokenPayload
78) -> String {
79    let data = fs::read(filepath)
80        .expect("Unable to read file");
81    
82    generate_with_data(data, header, payload)
83}
84
85pub fn generate_with_key_file(
86    key_file: &str,
87    key_id: &str,
88    typ: TokenType,
89    team_id: &str,
90    created_at: i64,
91    expires_at: i64,
92    origin: &str,
93) -> String {
94    let header = TokenHeader::new_with_key_id(key_id, typ);
95    let payload = TokenPayload::new_with(team_id, created_at, expires_at, origin);
96    generate_with_filepath(key_file, header, payload)
97}
98
99pub fn generate_with_key_data(
100    key_data: Vec<u8>,
101    key_id: &str,
102    typ: TokenType,
103    team_id: &str,
104    created_at: i64,
105    expires_at: i64,
106    origin: &str, 
107) -> String {
108    let header = TokenHeader::new_with_key_id(key_id, typ);
109    let payload = TokenPayload::new_with(team_id, created_at, expires_at, origin);
110    generate_with_data(key_data, header, payload)
111}
112
113pub fn generate_with_data(
114    data: Vec<u8>,
115    header: TokenHeader,
116    payload: TokenPayload
117) -> String {
118   let encoded_key = match  EncodingKey::from_ec_pem(&data) {
119        Ok(v) => v, 
120        Err(e) => panic!(e), 
121    };
122
123    let mut _header = Header::new(Algorithm::ES256);
124    _header.kid = header.kid.clone(); 
125    _header.typ = header.typ_to_value();
126
127    encode(&_header, &payload, &encoded_key).unwrap()
128}
129