Skip to content

Claims with Enum #417

Open
Open
@rado31

Description

@rado31

Example:

#![allow(dead_code)]

use chrono::{TimeDelta, Utc};
use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, Validation};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
enum Claims {
    Admin { id: i64, role_id: i64, exp: i64, iat: i64 },
    Client { id: i64, exp: i64, iat: i64 },
}

enum UserType {
    Admin,
    Client,
}

impl Claims {
    fn new(user_type: UserType) -> Self {
        let iat = Utc::now();
        let exp = iat + TimeDelta::try_seconds(900).unwrap();

        let iat = iat.timestamp();
        let exp = exp.timestamp();

        match user_type {
            UserType::Admin => Self::Admin { id: 1, role_id: 1, exp, iat },
            UserType::Client => Self::Client { id: 2, exp, iat },
        }
    }
}

fn main() {
    let claims = Claims::new(UserType::Admin);
    let token =
        encode(&Header::default(), &claims, &EncodingKey::from_secret("secret".as_ref())).unwrap();

    let payload = decode::<Claims>(
        &token,
        &DecodingKey::from_secret("secret".as_ref()),
        &Validation::default(),
    )
    .unwrap();

    println!("{payload:#?}");
}

When I encoding, the actual claims is Admin { id: i64, role_id: i64, exp: i64, iat: i64 }. In decode function there is must be Claims, because it can be Admin or Client (I can't know before).

Problem:

Using Claims will throw an error like Error(MissingRequiredClaim("exp")), because it is trying to decode whole Claims. How to solve this problem?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions