1use jaws::algorithms::SignatureBytes;
2use jaws::algorithms::TokenSigner;
3use jaws::algorithms::TokenVerifier;
4use jaws::key::DeserializeJWK;
5use jaws::token::Unverified;
6use jaws::Compact;
7use jaws::JWTFormat;
8use jaws::Token;
9use jaws::{Claims, RegisteredClaims};
10use rsa::pkcs8::DecodePrivateKey;
11use serde_json::json;
12use sha2::Sha256;
13
14fn type_name_of_val<T>(_: &T) -> &'static str {
15 std::any::type_name::<T>()
16}
17
18fn main() -> Result<(), Box<dyn std::error::Error>> {
19 let signing_key = rsa::RsaPrivateKey::from_pkcs8_pem(include_str!(concat!(
23 env!("CARGO_MANIFEST_DIR"),
24 "/examples/rfc7515a2.pem"
25 )))
26 .unwrap();
27 let verify_key: rsa::pkcs1v15::VerifyingKey<Sha256> =
28 rsa::pkcs1v15::VerifyingKey::new(signing_key.to_public_key());
29
30 let dyn_signing_key: Box<dyn TokenSigner<SignatureBytes>> = Box::new(
34 rsa::pkcs1v15::SigningKey::<Sha256>::new(signing_key.clone()),
35 );
36 let dyn_verify_key: Box<dyn TokenVerifier<SignatureBytes>> = Box::new(verify_key.clone());
37
38 let claims: Claims<serde_json::Value, (), String, (), ()> = Claims {
41 registered: RegisteredClaims {
42 subject: "1234567890".to_string().into(),
43 ..Default::default()
44 },
45 claims: json!({
46 "name": "John Doe",
47 "admin": true,
48 }),
49 };
50
51 let mut token = Token::compact((), claims);
56 *token.header_mut().r#type() = Some("JWT".to_string());
59
60 token.header_mut().key().derived();
63
64 println!("=== Initial JWT ===");
65
66 println!("{}", token.formatted());
68
69 let signed = token
71 .sign::<_, SignatureBytes>(dyn_signing_key.as_ref())
72 .unwrap();
73
74 let rendered = signed.rendered().unwrap();
75
76 let token: Token<Claims<serde_json::Value>, Unverified<()>, Compact> =
78 rendered.parse().unwrap();
79
80 println!("=== Parsed JWT ===");
81
82 println!("JWT:");
85 println!("{}", token.formatted());
86
87 let hdr = token.header();
89 let jwk = hdr.key().unwrap();
90 let key: rsa::pkcs1v15::VerifyingKey<Sha256> =
91 rsa::pkcs1v15::VerifyingKey::new(rsa::RsaPublicKey::from_jwk(jwk).unwrap());
92
93 println!("=== Verification === ");
94 token
96 .clone()
97 .verify::<_, rsa::pkcs1v15::Signature>(&verify_key)
98 .unwrap();
99 println!(
100 "Verified with verify key (typed): {}",
101 type_name_of_val(&verify_key)
102 );
103
104 let verified = token
106 .clone()
107 .verify::<_, SignatureBytes>(dyn_verify_key.as_ref())
108 .unwrap();
109 println!(
110 "Verified with dyn verify key: {}",
111 type_name_of_val(&dyn_verify_key)
112 );
113
114 token
116 .clone()
117 .verify::<_, rsa::pkcs1v15::Signature>(&key)
118 .unwrap();
119 println!("Verified with JWK");
120
121 println!("=== Verified JWT ===");
122 println!("JWT:");
123 println!("{}", verified.formatted());
124 println!(
125 "Payload: \n{}",
126 serde_json::to_string_pretty(&verified.payload()).unwrap()
127 );
128
129 Ok(())
130}