A lightweight layer on top of Hyper to facilitate building web applications.
Sputnik provides:
Request
& Response
Key
: a convenience wrapper around HMAC (stolen from the cookie crate, so
that you don't have to use CookieJar
s if you don't need them)decode_expiring_claim
& encode_expiring_claim
, which can be combined with
Key
to implement signed & expiring cookies
(with the expiry date encoded into the signed cookie value)Sputnik does not:
match
ing on (method, path) suffices```rs use std::convert::Infallible; use hyper::service::{servicefn, makeservice_fn}; use hyper::{Method, Server}; use serde::Deserialize; use sputnik::security::CsrfToken; use sputnik::{Request, Response, Error};
async fn route(req: &mut Request) -> Result
async fn getform(req: &mut Request) -> Result
struct FormData {text: String}
async fn postform(req: &mut Request) -> Result
/// adapt between Hyper's types and Sputnik's convenience types
async fn service(req: hyper::Request
async fn main() { let service = makeservicefn(move || { async move { Ok::<_, hyper::Error>(servicefn(move |req| { service(req) })) } });
let addr = ([127, 0, 0, 1], 8000).into();
let server = Server::bind(&addr).serve(service);
println!("Listening on http://{}", addr);
server.await;
} ```
After a successful authentication you can build a session id cookie for example as follows:
rs
let expiry_date = OffsetDateTime::now_utc() + Duration::hours(24);
let mut cookie = Cookie::new("userid",
key.sign(
&encode_expiring_claim(&userid, expiry_date)
));
cookie.set_secure(Some(true));
cookie.set_expires(expiry_date);
cookie.set_same_site(SameSite::Lax);
resp.set_cookie(cookie);
This session id cookie can then be retrieved and verified as follows:
rs
let userid = req.cookies().get("userid")
.ok_or_else(|| Error::unauthorized("expected userid cookie".to_owned()))
.and_then(|cookie| key.verify(cookie.value()).map_err(Error::unauthorized))
.and_then(|value| decode_expiring_claim(value).map_err(|e| Error::unauthorized(format!("failed to decode userid cookie: {}", e))))?;
Tip: If you want to store multiple claims in the cookie, you can (de)serialize a struct with serde_json. This approach can pose a lightweight alternative to JWT, if you don't care about the standardization aspect.