Open
Description
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
Labels
No labels