Skip to main content

HttpAuthentication

Struct HttpAuthentication 

Source
pub struct HttpAuthentication<T, F>
where T: FromRequest,
{ /* private fields */ }
Expand description

Middleware for checking HTTP authentication.

By default, if the extractor T fails (for example because the Authorization header is missing), this middleware returns an error immediately, without calling the F callback.

To make authentication optional (or to implement multiple auth methods), wrap the extractor in Option<T> or Result<T, T::Error>. In those cases, extraction never fails, so the validator always runs and can decide how to proceed.

Otherwise, it will pass both the request and the parsed credentials into it. In case of successful validation F callback is required to return the ServiceRequest back.

Implementations§

Source§

impl<T, F, O> HttpAuthentication<T, F>
where T: FromRequest, F: Fn(ServiceRequest, T) -> O, O: Future<Output = Result<ServiceRequest, (Error, ServiceRequest)>>,

Source

pub fn with_fn(process_fn: F) -> HttpAuthentication<T, F>

Construct HttpAuthentication middleware with the provided auth extractor T and validation callback F.

This function can be used to implement optional authentication and/or custom responses to missing authentication.

§Examples
§Required Basic Auth
async fn validator(
    req: ServiceRequest,
    credentials: BasicAuth,
) -> Result<ServiceRequest, (actix_web::Error, ServiceRequest)> {
    eprintln!("{credentials:?}");

    if credentials.user_id().contains('x') {
        return Err((actix_web::error::ErrorBadRequest("user ID contains x"), req));
    }

    Ok(req)
}
§Optional Bearer Auth (fallback to other auth methods)
async fn validator(
    req: ServiceRequest,
    credentials: Option<BearerAuth>,
) -> Result<ServiceRequest, (actix_web::Error, ServiceRequest)> {
    let Some(credentials) = credentials else {
        // No Authorization header; allow other auth methods (eg cookies/sessions) to proceed.
        return Ok(req);
    };

    eprintln!("{credentials:?}");

    if credentials.token().contains('x') {
        return Err((actix_web::error::ErrorBadRequest("token contains x"), req));
    }

    Ok(req)
}
Source§

impl<F, O> HttpAuthentication<BasicAuth, F>

Source

pub fn basic(process_fn: F) -> Self

Construct HttpAuthentication middleware for the HTTP “Basic” authentication scheme.

§Examples
// In this example validator returns immediately, but since it is required to return
// anything that implements `IntoFuture` trait, it can be extended to query database or to
// do something else in a async manner.
async fn validator(
    req: ServiceRequest,
    credentials: BasicAuth,
) -> Result<ServiceRequest, (Error, ServiceRequest)> {
    // All users are great and more than welcome!
    Ok(req)
}

let middleware = HttpAuthentication::basic(validator);
Source§

impl<F, O> HttpAuthentication<BearerAuth, F>

Source

pub fn bearer(process_fn: F) -> Self

Construct HttpAuthentication middleware for the HTTP “Bearer” authentication scheme.

§Examples
async fn validator(
    req: ServiceRequest,
    credentials: BearerAuth
) -> Result<ServiceRequest, (Error, ServiceRequest)> {
    if credentials.token() == "mF_9.B5f-4.1JqM" {
        Ok(req)
    } else {
        let config = req.app_data::<bearer::Config>()
            .cloned()
            .unwrap_or_default()
            .scope("urn:example:channel=HBO&urn:example:rating=G,PG-13");

        Err((AuthenticationError::from(config).into(), req))
    }
}

let middleware = HttpAuthentication::bearer(validator);

Trait Implementations§

Source§

impl<T, F: Clone> Clone for HttpAuthentication<T, F>
where T: FromRequest + Clone,

Source§

fn clone(&self) -> HttpAuthentication<T, F>

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<T, F: Debug> Debug for HttpAuthentication<T, F>
where T: FromRequest + Debug,

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<S, B, T, F, O> Transform<S, ServiceRequest> for HttpAuthentication<T, F>
where S: Service<ServiceRequest, Response = ServiceResponse<B>, Error = Error> + 'static, S::Future: 'static, F: Fn(ServiceRequest, T) -> O + 'static, O: Future<Output = Result<ServiceRequest, (Error, ServiceRequest)>> + 'static, T: FromRequest + 'static, B: MessageBody + 'static,

Source§

type Response = ServiceResponse<EitherBody<B>>

Responses produced by the service.
Source§

type Error = Error

Errors produced by the service.
Source§

type Transform = AuthenticationMiddleware<S, F, T>

The TransformService value created by this factory
Source§

type InitError = ()

Errors produced while building a transform service.
Source§

type Future = Ready<Result<<HttpAuthentication<T, F> as Transform<S, ServiceRequest>>::Transform, <HttpAuthentication<T, F> as Transform<S, ServiceRequest>>::InitError>>

The future response value.
Source§

fn new_transform(&self, service: S) -> Self::Future

Creates and returns a new Transform component, asynchronously

Auto Trait Implementations§

§

impl<T, F> Freeze for HttpAuthentication<T, F>
where Arc<F>: Freeze, PhantomData<T>: Freeze,

§

impl<T, F> RefUnwindSafe for HttpAuthentication<T, F>

§

impl<T, F> Send for HttpAuthentication<T, F>
where Arc<F>: Send, PhantomData<T>: Send,

§

impl<T, F> Sync for HttpAuthentication<T, F>
where Arc<F>: Sync, PhantomData<T>: Sync,

§

impl<T, F> Unpin for HttpAuthentication<T, F>
where Arc<F>: Unpin, PhantomData<T>: Unpin,

§

impl<T, F> UnsafeUnpin for HttpAuthentication<T, F>

§

impl<T, F> UnwindSafe for HttpAuthentication<T, F>

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

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> 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.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more