Skip to content

Commit 4c71cca

Browse files
committed
Add example for atproto JWTs, which use ES256K
1 parent d907bc5 commit 4c71cca

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

examples/atproto.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use jsonwebtoken::jwk::Jwk;
2+
use jsonwebtoken::{DecodingKey, Validation, decode, decode_header};
3+
use std::collections::HashMap;
4+
5+
// These were generated from Node.js using the @atproto/crypto library:
6+
const TOKEN: &str = "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NksifQ.eyJzY29wZSI6ImNvbS5hdHByb3RvLmFjY2VzcyIsInN1YiI6ImRpZDpleGFtcGxlOmFsaWNlIiwiaWF0IjoxNzYyODA5ODk4LCJhdWQiOiJkaWQ6d2ViOmJza3kubmV0d29yayJ9.krVCmWVQ2lTdXzi7Gcu0vv-szONeYj7kSpevjGiGBJcJnY5NgweIhNEzsnqoi6ni9VONgIrYfCj6T7LhJr9isg";
7+
const JWK: &str = r#"{ "kty": "EC", "x": "elgF6kwpkD00J9SPmoXBtaueneZf-77LnzrGrB7Ic7A", "y": "BTKRlhfwemkSQdB560lxw-Sg4GNH1gjkXXrryU-7jNM", "crv": "secp256k1" }"#;
8+
9+
fn main() -> Result<(), Box<dyn std::error::Error>> {
10+
let jwk: Jwk = serde_json::from_str(JWK).unwrap();
11+
let header = decode_header(TOKEN).unwrap();
12+
13+
println!("Header: {}", serde_json::to_string(&header).unwrap());
14+
15+
let validation = {
16+
let mut validation = Validation::new(header.alg);
17+
validation.set_audience(&["did:web:bsky.network"]);
18+
validation.set_required_spec_claims(&["sub", "scope"]);
19+
validation.validate_exp = false;
20+
validation
21+
};
22+
23+
let decoded_token = decode::<HashMap<String, serde_json::Value>>(
24+
TOKEN,
25+
&DecodingKey::from_jwk(&jwk).unwrap(),
26+
&validation,
27+
)?;
28+
29+
println!("{:#?}", decoded_token);
30+
31+
Ok(())
32+
}

0 commit comments

Comments
 (0)