Skip to main content

IdentityService

Struct IdentityService 

Source
pub struct IdentityService { /* private fields */ }
Expand description

Composes every collaborator needed for the core auth flows. Cheap to clone (all fields are Arc), so it can be provided and injected freely.

Implementations§

Source§

impl IdentityService

Source

pub fn builder( users: Arc<dyn UserStore>, creds: Arc<dyn CredentialStore>, hasher: Arc<dyn PasswordHasher>, jwt: Arc<JwtService>, refresh: Arc<dyn RefreshStore>, challenges: Arc<dyn ChallengeStore>, ) -> IdentityServiceBuilder

Start building. Required collaborators are passed here; optional ones (lockout, MFA) and config are attached fluently.

Source

pub async fn register(&self, req: RegisterRequest) -> Result<Identity>

Register a new user. Hashes the password (if any) off the reactor, stores the identity, and returns it. Does not issue tokens — callers usually send a verification email first.

Source

pub async fn login( &self, tenant: Option<&str>, email: &str, password: &str, ) -> Result<LoginOutcome>

Authenticate with email + password. Returns either issued tokens or an MFA challenge. principal_ip seeds lockout before the user is known.

Source

pub async fn login_bound( &self, tenant: Option<&str>, email: &str, password: &str, cnf_jkt: Option<&str>, ) -> Result<LoginOutcome>

Like login but sender-constrains the issued access token to a DPoP key (cnf_jkt from a verified proof, RFC 9449 / H3). The binding is applied on the direct-auth path; when MFA is enrolled the challenge path mints in verify_mfa (unbound for now).

Source

pub async fn verify_mfa( &self, challenge_id: &str, method: &str, code: &str, ) -> Result<TokenResponse>

Complete a pending MFA challenge with a factor response (method = e.g. "totp" / "recovery", code = the user-supplied value).

Source

pub async fn login_federated( &self, tenant: Option<&str>, profile: &FederatedProfile, signal: Option<RiskSignal>, ) -> Result<FederatedOutcome>

Authenticate a user from an external identity provider (social login / enterprise SSO), applying the takeover-safe linking policy, optional risk step-up, and auditing — then minting through the same path as password login. signal (when a RiskEngine is configured) drives adaptive MFA.

See crate::federation for the security rationale behind each branch.

Explicitly link an external identity to an already-authenticated local user (user_id). This is the takeover-proof path the app runs after the user proves ownership of the local account, in response to a FederatedOutcome::LinkRequired.

Source

pub async fn refresh(&self, refresh_token: &str) -> Result<TokenResponse>

Rotate a refresh token: validate signature + stored jti, atomically consume the old jti, and issue a fresh pair. Reuse of a consumed token fails closed.

Source

pub async fn logout(&self, refresh_token: &str) -> Result<()>

Revoke a specific refresh token (single-device logout).

Source

pub async fn logout_all(&self, user_id: &str) -> Result<()>

Revoke every refresh token for a user (“log out everywhere”).

Source

pub async fn me(&self, user_id: &str) -> Result<Identity>

Fetch the current identity by id (for /auth/me).

Source

pub async fn mint(&self, user: &Identity) -> Result<TokenResponse>

Mint an access+refresh pair for an authenticated identity and persist the refresh jti for rotation.

Source

pub async fn mint_bound( &self, user: &Identity, cnf_jkt: Option<&str>, ) -> Result<TokenResponse>

Like mint but sender-constrains the access token to a DPoP key thumbprint (RFC 9449, H3). cnf_jkt comes from a verified DpopProof; the resource server then requires a matching proof on every request, so a leaked token can’t be replayed.

Trait Implementations§

Source§

impl Clone for IdentityService

Source§

fn clone(&self) -> IdentityService

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

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

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

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

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

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
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> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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 = 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>,

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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