Skip to main content

StateGuard

Enum StateGuard 

Source
pub enum StateGuard {
    Session(SessionState),
    Sealed(SealedState),
}
Expand description

Issues the state, and checks it when the visitor comes back.

Both modes bind the PKCE verifier to the state, so recovering one recovers the other and a caller cannot accidentally exchange a code against a verifier from a different flow.

Variants§

§

Session(SessionState)

The state is a random nonce; the nonce and the verifier live in the session. Prefer this: the entry is deleted when it is checked, so a state works exactly once.

§

Sealed(SealedState)

The state is sealed with a key derived from APP_KEY and carries the verifier and its own issue time. Nothing is stored server-side, which is what a fleet with no shared session store needs.

Implementations§

Source§

impl StateGuard

Source

pub fn session(session: &SessionHandle) -> StateGuard

The stateful mode, on the request’s session.

Source

pub fn sealed(key: &AppKey) -> StateGuard

The stateless mode, keyed off the application key.

Source

pub fn issue(&self, pkce: &Pkce) -> Result<String, OAuthError>

A fresh state committing to pkce.

Source

pub fn verify(&self, presented: Option<&str>) -> Result<Pkce, StateError>

Check what came back, and recover the verifier it was issued with.

None is the missing case rather than an error the caller has to spell out, because “the query string had no state” is the most common shape of the attack and must not be reachable by forgetting a check.

Source

pub fn lifetime(self, lifetime: Duration) -> StateGuard

How long an issued state stays valid.

Trait Implementations§

Source§

impl Clone for StateGuard

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StateGuard

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.