use jaws::algorithms::SignatureBytes;
use jaws::algorithms::TokenSigner;
use jaws::algorithms::TokenVerifier;
use jaws::key::DeserializeJWK;
use jaws::token::Unverified;
use jaws::Compact;
use jaws::JWTFormat;
use jaws::Token;
use jaws::{Claims, RegisteredClaims};
use rsa::pkcs8::DecodePrivateKey;
use serde_json::json;
use sha2::Sha256;
fn type_name_of_val<T>(_: &T) -> &'static str {
std::any::type_name::<T>()
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let signing_key = rsa::RsaPrivateKey::from_pkcs8_pem(include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/examples/rfc7515a2.pem"
)))
.unwrap();
let verify_key: rsa::pkcs1v15::VerifyingKey<Sha256> =
rsa::pkcs1v15::VerifyingKey::new(signing_key.to_public_key());
let dyn_signing_key: Box<dyn TokenSigner<SignatureBytes>> = Box::new(
rsa::pkcs1v15::SigningKey::<Sha256>::new(signing_key.clone()),
);
let dyn_verify_key: Box<dyn TokenVerifier<SignatureBytes>> = Box::new(verify_key.clone());
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::<_, SignatureBytes>(dyn_signing_key.as_ref())
.unwrap();
let rendered = signed.rendered().unwrap();
let token: Token<Claims<serde_json::Value>, Unverified<()>, Compact> =
rendered.parse().unwrap();
println!("=== Parsed JWT ===");
println!("JWT:");
println!("{}", token.formatted());
let hdr = token.header();
let jwk = hdr.key().unwrap();
let key: rsa::pkcs1v15::VerifyingKey<Sha256> =
rsa::pkcs1v15::VerifyingKey::new(rsa::RsaPublicKey::from_jwk(jwk).unwrap());
println!("=== Verification === ");
token
.clone()
.verify::<_, rsa::pkcs1v15::Signature>(&verify_key)
.unwrap();
println!(
"Verified with verify key (typed): {}",
type_name_of_val(&verify_key)
);
let verified = token
.clone()
.verify::<_, SignatureBytes>(dyn_verify_key.as_ref())
.unwrap();
println!(
"Verified with dyn verify key: {}",
type_name_of_val(&dyn_verify_key)
);
token
.clone()
.verify::<_, rsa::pkcs1v15::Signature>(&key)
.unwrap();
println!("Verified with JWK");
println!("=== Verified JWT ===");
println!("JWT:");
println!("{}", verified.formatted());
println!(
"Payload: \n{}",
serde_json::to_string_pretty(&verified.payload()).unwrap()
);
Ok(())
}