JWT access token and refresh token
Access Token
The simplest method to use JWT is to read it from a cookie. Let's start with some boilerplate where we have
token
and
some_data
to be loaded from API.
use vertigo::{dom, LazyCache, Resource, Value}; #[derive(Clone, PartialEq)] struct Data; let token: Value<Option<String>> = Value::new(None); let some_data: Value<Option<LazyCache<Data>>> = Value::new(None); let token_span = token.render_value(|token| match token { Some(token) => dom! { <span>{token}</span> }, None => dom! { <i>"None"</i> }, }); let data_state_str = some_data.render_value(|data| match data { Some(resource) => resource.to_computed().render_value(|res| match res { Resource::Loading => dom! { <i>"Loading"</i> }, Resource::Ready(_) => dom! { <i>"Data loaded"</i> }, Resource::Error(err) => dom! { <i>"Error: " {err}</i> }, }), None => dom! { <i>"None"</i> }, }); dom! { <div> <p> "Current token: " {token_span} </p> <p> "Data state: " {data_state_str} </p> </div> }
Reading it from a cookie can be done through the
Driver
:
use vertigo::{get_driver, Value}; let cookie = get_driver().cookie_get("jwt_token"); let token: Value<Option<String>> = Value::new((!cookie.is_empty()).then_some(cookie));
Reading the data using token:
let load_data = bind!(token, some_data, || { transaction(|ctx| { if let Some(token) = token.get(ctx) { let data_resource = LazyCache::new( get_driver() .request_get("https://example.com/api/data") .bearer_auth(token) .ttl_minutes(1), |status, body| { if status == 200 { Some(body.into::<Data>()) } else { None } }, ); some_data.set(Some(data_resource)); } }) });
To be continued...
Refresh Token
To be continued...