use jaws::Compact;
use jaws::JWTFormat;
use jaws::Token;
use jaws::key::DeserializeJWK;
use jaws::token::Unverified;
use jaws::{Claims, RegisteredClaims};
use rsa::pkcs8::DecodePrivateKey;
use sha2::Sha256;
use serde_json::json;
use signature::Keypair;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let key = rsa::RsaPrivateKey::from_pkcs8_pem(include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/examples/rfc7515a2.pem"
)))
.unwrap();
let alg = rsa::pkcs1v15::SigningKey::<Sha256>::new(key);
let claims: Claims<serde_json::Value, (), String, (), ()> = Claims {
registered: RegisteredClaims {
subject: "1234567890".to_string().into(),
..Default::default()
},
claims: json!({
"name": "John Doe",
"admin": true,
}),
};
let mut token = Token::compact((), claims);
*token.header_mut().r#type() = Some("JWT".to_string());
token.header_mut().key().derived();
println!("=== Initial JWT ===");
println!("{}", token.formatted());
let signed = token.sign::<_, rsa::pkcs1v15::Signature>(&alg).unwrap();
println!("=== Signed JWT ===");
println!("JWT:");
println!("{}", signed.formatted());
println!("Token: {}", signed.rendered().unwrap());
println!(
"Type: {:?}, Algorithm: {:?}",
signed.header().r#type(),
signed.header().algorithm(),
);
let token: Token<Claims<serde_json::Value>, Unverified<()>, Compact> =
signed.rendered().unwrap().parse().unwrap();
println!("=== Parsed JWT ===");
println!("JWT:");
println!("{}", token.formatted());
let hdr = token.header();
let jwk = hdr.key().unwrap();
let key = rsa::RsaPublicKey::from_jwk(jwk).unwrap();
assert_eq!(&key, alg.verifying_key().as_ref());
println!("=== Verification === ");
let alg: rsa::pkcs1v15::VerifyingKey<Sha256> = alg.verifying_key();
let verified = token
.verify::<_, jaws::algorithms::SignatureBytes>(&alg)
.unwrap();
println!("=== Verified JWT ===");
println!("JWT:");
println!("{}", verified.formatted());
println!(
"Payload: \n{}",
serde_json::to_string_pretty(&verified.payload()).unwrap()
);
Ok(())
}