use jsonwebtoken::errors::ErrorKind; use jsonwebtoken::{decode, encode, Algorithm, DecodingKey, EncodingKey, Header, Validation}; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] struct Claims { aud: String, sub: String, company: String, exp: usize, } fn main() { let key = b"secret"; let my_claims = Claims { aud: "me".to_owned(), sub: "b@b.com".to_owned(), company: "ACME".to_owned(), exp: 10000000000, }; let token = match encode(&Header::default(), &my_claims, &EncodingKey::from_secret(key)) { Ok(t) => t, Err(_) => panic!(), // in practice you would return the error }; let mut validation = Validation::new(Algorithm::HS256); validation.sub = Some("b@b.com".to_string()); validation.set_audience(&["me"]); let token_data = match decode::(&token, &DecodingKey::from_secret(key), &validation) { Ok(c) => c, Err(err) => match *err.kind() { ErrorKind::InvalidToken => panic!("Token is invalid"), // Example on how to handle a specific error ErrorKind::InvalidIssuer => panic!("Issuer is invalid"), // Example on how to handle a specific error _ => panic!("Some other errors"), }, }; println!("{:?}", token_data.claims); println!("{:?}", token_data.header); }