use std::time; use argon2::Argon2; use jsonwebtoken::{encode, EncodingKey}; use serde::Serialize; use uuid::Uuid; #[derive(Debug, Serialize)] struct Claims { sub: String, iss: String, aud: String, iat: u64, nbf: u64, exp: u64, } fn main() { let args: Vec<_> = std::env::args().collect(); let hostname = &args[1]; let machine_id = Uuid::parse_str(&args[2]).unwrap(); let audience = &args[3]; let now = time::SystemTime::now() .duration_since(time::UNIX_EPOCH) .unwrap() .as_secs(); let claims = Claims { sub: hostname.into(), iss: hostname.into(), aud: audience.into(), nbf: now - 60, iat: now, exp: now + 60, }; let mut secret = [0u8; 32]; Argon2::default() .hash_password_into( machine_id.as_bytes(), hostname.as_bytes(), &mut secret, ) .unwrap(); let key = EncodingKey::from_secret(&secret); eprintln!("{:?}", claims); println!("{}", encode(&Default::default(), &claims, &key).unwrap()); }