Struct oxide_auth_rocket::Generic

source ·
pub struct Generic<R, A, I, S = Vacant, C = Vacant, L = Vacant> {
    pub registrar: R,
    pub authorizer: A,
    pub issuer: I,
    pub solicitor: S,
    pub scopes: C,
    pub response: L,
}
Expand description

A rather basic Endpoint implementation.

Substitue all parts that are not provided with the marker struct Vacant. This will at least ensure that no security properties are violated. Some flows may be unavailable when some primitives are missing. See AuthorizationFlow, AccessTokenFlow, ResourceFlow for more details.

Included types are assumed to be implemented independently, with no major connections. All attributes are public, so there is no inner invariant.

§Usage

You should prefer this implementation when there are special requirements for your Endpoint implementation, or it is created ad-hoc. It also does some static type checking on dedicated methods to ensure that the creation of specific flows succeeds. You should prefer authorization_flow, access_token_flow, and resource_flow over the erroring preparation methods in AuthorizationFlow, AccessTokenFlow, and ResourceFlow respectively.

This should not be used when you special interacting primitives are used, that originate from outside this library. For example if you intend for your Scopes to be dynamically generated from a list of registered clients, its likely cleaner to provide your own Endpoint implementation instead.

§Example

Here is an example where a Generic is used to set up an endpoint that is filled with the minimal members to be useable for an AccessTokenFlow.

use oxide_auth::endpoint::{AccessTokenFlow, Endpoint, WebRequest};
use oxide_auth::primitives::{
    authorizer::AuthMap,
    generator::RandomGenerator,
    issuer::TokenMap,
    registrar::ClientMap,
};

fn access_token_endpoint<R: WebRequest>() -> AccessTokenFlow<impl Endpoint<R>, R>
    where R::Response: Default,
{
    let endpoint = Generic {
        authorizer: AuthMap::new(RandomGenerator::new(16)),
        registrar: ClientMap::new(),
        issuer: TokenMap::new(RandomGenerator::new(16)),
        scopes: Vacant,
        solicitor: Vacant,
        response: Vacant,
    };
    endpoint.access_token_flow()
}

Fields§

§registrar: R

The registrar implementation, or Vacant if it is not necesary.

§authorizer: A

The authorizer implementation, or Vacant if it is not necesary.

§issuer: I

The issuer implementation, or Vacant if it is not necesary.

§solicitor: S

A solicitor implementation fit for the request types, or Vacant if it is not necesary.

§scopes: C

Determine scopes for the request types, or Vacant if this does not protect resources.

§response: L

Creates responses, or Vacant if Default::default is applicable.

Implementations§

source§

impl<R, A, I, O, C, L> Generic<R, A, I, O, C, L>

source

pub fn with_solicitor<N>(self, new_solicitor: N) -> Generic<R, A, I, N, C, L>

Change the used solicitor.

source

pub fn with_scopes<S>(self, new_scopes: S) -> Generic<R, A, I, O, S, L>

Change the used scopes.

source

pub fn authorization_flow<W>( self ) -> AuthorizationFlow<Generic<R, A, I, O, C, L>, W>
where W: WebRequest, Generic<R, A, I, O, C, L>: Endpoint<W>, R: Registrar, A: Authorizer,

Create an authorization flow.

Opposed to AuthorizationFlow::prepare this statically ensures that the construction succeeds.

source

pub fn access_token_flow<W>( self ) -> AccessTokenFlow<Generic<R, A, I, O, C, L>, W>
where W: WebRequest, Generic<R, A, I, O, C, L>: Endpoint<W>, R: Registrar, A: Authorizer, I: Issuer,

Create an access token flow.

Opposed to AccessTokenFlow::prepare this statically ensures that the construction succeeds.

source

pub fn refresh_flow<W>(self) -> RefreshFlow<Generic<R, A, I, O, C, L>, W>
where W: WebRequest, Generic<R, A, I, O, C, L>: Endpoint<W>, R: Registrar, I: Issuer,

Create a token refresh flow.

Opposed to RefreshFlow::prepare this statically ensures that the construction succeeds.

source

pub fn resource_flow<W>(self) -> ResourceFlow<Generic<R, A, I, O, C, L>, W>
where W: WebRequest, Generic<R, A, I, O, C, L>: Endpoint<W>, I: Issuer,

Create a resource access flow.

Opposed to ResourceFlow::prepare this statically ensures that the construction succeeds.

source

pub fn assert<W>(self) -> Generic<R, A, I, O, C, L>
where W: WebRequest, Generic<R, A, I, O, C, L>: Endpoint<W>,

Check, statically, that this is an endpoint for some request.

This is mainly a utility method intended for compilation and integration tests.

Trait Implementations§

source§

impl<W, R, A, I, O, C, L> Endpoint<W> for Generic<R, A, I, O, C, L>

§

type Error = Error<W>

The error typed used as the error representation of each flow.
source§

fn registrar(&self) -> Option<&dyn Registrar>

A registrar if this endpoint can access one. Read more
source§

fn authorizer_mut(&mut self) -> Option<&mut dyn Authorizer>

An authorizer if this endpoint can access one. Read more
source§

fn issuer_mut(&mut self) -> Option<&mut dyn Issuer>

An issuer if this endpoint can access one. Read more
source§

fn owner_solicitor(&mut self) -> Option<&mut dyn OwnerSolicitor<W>>

Return the system that checks owner consent. Read more
source§

fn scopes(&mut self) -> Option<&mut dyn Scopes<W>>

Determine the required scopes for a request. Read more
source§

fn response( &mut self, request: &mut W, kind: Template<'_> ) -> Result<<W as WebRequest>::Response, <Generic<R, A, I, O, C, L> as Endpoint<W>>::Error>

Generate a prototype response. Read more
source§

fn error(&mut self, err: OAuthError) -> Error<W>

Wrap an error.
source§

fn web_error(&mut self, err: <W as WebRequest>::Error) -> Error<W>

Wrap an error in the request/response types.
source§

fn extension(&mut self) -> Option<&mut dyn Extension>

Get the central extension instance this endpoint. Read more

Auto Trait Implementations§

§

impl<R, A, I, S, C, L> Freeze for Generic<R, A, I, S, C, L>
where R: Freeze, A: Freeze, I: Freeze, S: Freeze, C: Freeze, L: Freeze,

§

impl<R, A, I, S, C, L> RefUnwindSafe for Generic<R, A, I, S, C, L>

§

impl<R, A, I, S, C, L> Send for Generic<R, A, I, S, C, L>
where R: Send, A: Send, I: Send, S: Send, C: Send, L: Send,

§

impl<R, A, I, S, C, L> Sync for Generic<R, A, I, S, C, L>
where R: Sync, A: Sync, I: Sync, S: Sync, C: Sync, L: Sync,

§

impl<R, A, I, S, C, L> Unpin for Generic<R, A, I, S, C, L>
where R: Unpin, A: Unpin, I: Unpin, S: Unpin, C: Unpin, L: Unpin,

§

impl<R, A, I, S, C, L> UnwindSafe for Generic<R, A, I, S, C, L>

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, I> AsResult<T, I> for T
where I: Input,

source§

fn as_result(self) -> Result<T, ParseErr<I>>

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> 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> IntoCollection<T> for T

source§

fn into_collection<A>(self) -> SmallVec<A>
where A: Array<Item = T>,

Converts self into a collection.
source§

fn mapped<U, F, A>(self, f: F) -> SmallVec<A>
where F: FnMut(T) -> U, A: Array<Item = U>,

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

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

§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

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

§

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.
source§

impl<T> Typeable for T
where T: Any,

source§

fn get_type(&self) -> TypeId

Get the TypeId of this object.
source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V