ts_webapi/middleware/
mod.rs1pub mod api_key;
4pub mod authorization;
5pub mod futures;
6#[cfg(feature = "token")]
7pub mod token;
8
9pub use api_key::ApiKeyAuth;
10pub use authorization::Authorization;
11#[cfg(feature = "token")]
12pub use token::TokenAuth;
13
14#[cfg(test)]
15pub(crate) mod test {
16 use base64ct::{Base64, Encoding};
17 use bytes::Bytes;
18 use http::{HeaderValue, Request, header::AUTHORIZATION};
19 use http_body_util::Full;
20 use ts_token::{JsonWebKey, SigningKey, TokenType};
21
22 pub const JWK: &str = r#"{
23 "kty": "OKP",
24 "use": "Sig",
25 "kid": "UMIi0hdlBBcIG8oCOmBi_0bvQflivgxp9DKe2L6PjbE",
26 "alg": "Ed25519",
27 "crv": "Ed25519",
28 "x": "O7pSN1soY_McVq81qfRvhZchRr6Umoy9Ln_Ip4RIaeU"
29}"#;
30
31 pub fn get_request(typ: Option<TokenType>) -> Request<Full<Bytes>> {
32 const PRIVATE_KEY: &str =
33 "MC4CAQAwBQYDK2VwBCIEIDFG7nt5nLUgXyExl59kV039R4bllef3niGAp1FjI7or";
34
35 let mut request = Request::builder().uri("/resource/id");
36
37 if let Some(typ) = typ {
38 let signing_key = {
39 let private_key =
40 Base64::decode_vec(PRIVATE_KEY).expect("PRIVATE_KEY should be valid base64");
41
42 let jwk: JsonWebKey =
43 serde_json::from_str(JWK).expect("JWK should be a valid JsonWebKey");
44
45 SigningKey::new(jwk, &private_key).expect("signing key should be valid")
46 };
47
48 let token = signing_key
49 .issue_jwt("subject".to_string(), typ)
50 .expect("issuing a JWT should be ok")
51 .serialize();
52
53 request.headers_mut().expect("request should be ok").insert(
54 AUTHORIZATION,
55 HeaderValue::from_str(&format!("bearer {token}"))
56 .expect("token should be a valid header value"),
57 );
58 }
59
60 request
61 .body(Full::<Bytes>::default())
62 .expect("request should be ok")
63 }
64}