jwt_tonic_user_uuid/
lib.rs1use jsonwebtoken::errors::ErrorKind;
2use jsonwebtoken::{Algorithm, DecodingKey, Validation};
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6pub mod grpc;
7
8#[derive(Debug, Clone)]
12pub struct JWTUserTokenParser {
13 public_key: String,
14}
15
16#[derive(Debug, Serialize, Deserialize)]
20pub struct SessionTokenClaims {
21 pub exp: usize,
22 pub user: Uuid,
23}
24
25#[derive(Debug)]
26pub enum SessionTokenError {
27 InvalidSignature,
28 Expired,
29}
30
31impl JWTUserTokenParser {
32 pub fn new(public_key: String) -> Self {
33 Self { public_key }
34 }
35
36 pub fn get_user_uuid(&self, token: String) -> Result<Uuid, SessionTokenError> {
37 let token = JWTUserTokenParser::add_head(token);
38 match jsonwebtoken::decode::<SessionTokenClaims>(
39 token.as_str(),
40 &DecodingKey::from_ec_pem(self.public_key.as_bytes()).unwrap(),
41 &Validation::new(Algorithm::ES256),
42 ) {
43 Ok(token) => Result::Ok(token.claims.user),
44 Err(error) => match error.kind() {
45 ErrorKind::ExpiredSignature => Result::Err(SessionTokenError::Expired),
46 _ => Result::Err(SessionTokenError::InvalidSignature),
47 },
48 }
49 }
50
51 pub fn add_head(token: String) -> String {
56 format!("eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.{}", token)
57 }
58}