1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
pub mod prelude { pub use secp256k1::SecretKey; pub use tide::http::{headers::HeaderName, Url}; pub use web3::{transports::WebSocket, Web3}; } use prelude::*; use tide::{utils::async_trait, Middleware, Next, Request, Result}; use web3::signing::SecretKeyRef; #[derive(Clone)] pub struct ProvidesSignature { pub challenge: Vec<u8>, pub secret_key: SecretKey, pub signature_header: HeaderName, pub web3: Web3<WebSocket>, } #[async_trait] impl<State: Clone + Send + Sync + 'static> Middleware<State> for ProvidesSignature { async fn handle(&self, mut request: Request<State>, next: Next<'_, State>) -> Result { let key = SecretKeyRef::new(&self.secret_key); let signed_data = self.web3.accounts().sign(&self.challenge, key); let signature = signed_data.signature.0; request.append_header(&self.signature_header, base64::encode(signature)); Ok(next.run(request).await) } }