]> Untitled Git - lemmy.git/blob - crates/utils/src/claims.rs
User token revocation upon password change
[lemmy.git] / crates / utils / src / claims.rs
1 use crate::settings::Settings;
2 use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, TokenData, Validation};
3 use serde::{Deserialize, Serialize};
4
5 type Jwt = String;
6
7 #[derive(Debug, Serialize, Deserialize)]
8 pub struct Claims {
9   /// User id, for backward compatibility with client apps.
10   /// Claim [sub](Claims::sub) is used in server-side checks.
11   pub id: i32,
12   /// User id, standard claim by RFC 7519.
13   pub sub: i32,
14   pub iss: String,
15   /// Time when this token was issued as UNIX-timestamp in seconds
16   pub iat: i64,
17 }
18
19 impl Claims {
20   pub fn decode(jwt: &str) -> Result<TokenData<Claims>, jsonwebtoken::errors::Error> {
21     let v = Validation {
22       validate_exp: false,
23       ..Validation::default()
24     };
25     decode::<Claims>(
26       &jwt,
27       &DecodingKey::from_secret(Settings::get().jwt_secret.as_ref()),
28       &v,
29     )
30   }
31
32   pub fn jwt(user_id: i32, hostname: String) -> Result<Jwt, jsonwebtoken::errors::Error> {
33     let my_claims = Claims {
34       id: user_id,
35       sub: user_id,
36       iss: hostname,
37       iat: chrono::Utc::now().timestamp_millis() / 1000,
38     };
39     encode(
40       &Header::default(),
41       &my_claims,
42       &EncodingKey::from_secret(Settings::get().jwt_secret.as_ref()),
43     )
44   }
45 }