mapkitjs_token_gen/
lib.rs1extern 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