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: WebRequest>(self) -> AuthorizationFlow<Self, W>where Self: 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: WebRequest>(self) -> AccessTokenFlow<Self, W>where Self: 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: WebRequest>(self) -> RefreshFlow<Self, W>where Self: 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: WebRequest>(self) -> ResourceFlow<Self, W>where Self: 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: WebRequest>(self) -> Selfwhere Self: 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>where W: WebRequest, R: OptRegistrar, A: OptAuthorizer, I: OptIssuer, O: OwnerSolicitor<W>, C: Scopes<W>, L: ResponseCreator<W>,

§

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::Response, Self::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::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> RefUnwindSafe for Generic<R, A, I, S, C, L>where A: RefUnwindSafe, C: RefUnwindSafe, I: RefUnwindSafe, L: RefUnwindSafe, R: RefUnwindSafe, S: RefUnwindSafe,

§

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

§

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

§

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

§

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

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere 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 Twhere 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<T> for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for Twhere 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 Twhere 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.
§

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

§

fn vzip(self) -> V