pub struct Ticket<S: Service> {
pub service: ServiceId,
pub id: String,
pub data: S::TicketData,
}Expand description
Ticket to use a service.
This must be issued by a trusted backend for use in the (untrusted) frontend.
It carries
- an identifier of the service that is intended to be used,
- an arbitrary ticket identifier for verifying the results later on and
- any critical input data for the service.
The ticket data gets wrapped in a JSON Web Token as claim data.
The token must also contain an expiry in the claim exp and the key identifier in the kid header field.
Example issuance of an Authenticated<Ticket<accounts::Service>> for the accounts service:
use jsonwebtoken::{encode, Algorithm, EncodingKey, Header};
use serde::Serialize;
use std::time::{SystemTime, UNIX_EPOCH};
use uuid::Uuid;
let ticket_id = Uuid::new_v4().to_string();
#[derive(Serialize, Debug)]
struct Ticket<T> {
service: String,
id: String,
data: T,
}
#[derive(Serialize, Debug)]
struct Claims<T> {
data: Ticket<T>,
exp: u64,
}
let header = Header {
alg: Algorithm::HS256,
kid: Some(HMAC_KEY_ID.to_string()),
..Default::default()
};
let authenticated_ticket = encode(
&header,
&Claims {
data: Ticket {
service: "Accounts".to_string(),
id: ticket_id,
data: (),
},
exp: SystemTime::now().duration_since(UNIX_EPOCH).expect("Time went backwards").as_secs() + 600,
},
&EncodingKey::from_secret(HMAC_KEY),
)?;Fields§
§service: ServiceId§id: String§data: S::TicketDataTrait Implementations§
Source§impl<'de, S: Service> Deserialize<'de> for Ticket<S>where
S::TicketData: Deserialize<'de>,
impl<'de, S: Service> Deserialize<'de> for Ticket<S>where
S::TicketData: Deserialize<'de>,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
impl<S: Service> Eq for Ticket<S>
Auto Trait Implementations§
impl<S> Freeze for Ticket<S>
impl<S> RefUnwindSafe for Ticket<S>
impl<S> Send for Ticket<S>
impl<S> Sync for Ticket<S>
impl<S> Unpin for Ticket<S>
impl<S> UnwindSafe for Ticket<S>
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more