jwt_tonic_user_uuid/
lib.rs

1use jsonwebtoken::errors::ErrorKind;
2use jsonwebtoken::{Algorithm, DecodingKey, Validation};
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6pub mod grpc;
7
8///
9/// Валидация и получение идентификатора пользователя из сессионного токена
10///
11#[derive(Debug, Clone)]
12pub struct JWTUserTokenParser {
13    public_key: String,
14}
15
16///
17/// JWT сессионный токен
18///
19#[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    ///
52    ///  "typ": "JWT",
53    //   "alg": "ES256"
54    //
55    pub fn add_head(token: String) -> String {
56        format!("eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.{}", token)
57    }
58}