Skip to main content

MultiKeyVerifier

Struct MultiKeyVerifier 

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

Multi-key verifier supporting graceful key rotation

This verifier maintains multiple keys and attempts verification with each until one succeeds. This allows zero-downtime key rotation:

  1. Generate new key pair
  2. Add new key as primary, mark old key as secondary with grace period
  3. Update JWKS to include both keys
  4. After grace period, remove old key

§Example

use hyperstack_auth::{MultiKeyVerifier, RotationKey, SigningKey};
use std::time::Duration;

// Generate key pairs
let old_signing_key = SigningKey::generate();
let old_verifying_key = old_signing_key.verifying_key();
let new_signing_key = SigningKey::generate();
let new_verifying_key = new_signing_key.verifying_key();

// Create rotation keys
let old_key = RotationKey::secondary(old_verifying_key, "key-1", Duration::from_secs(86400));
let new_key = RotationKey::primary(new_verifying_key, "key-2");

let verifier = MultiKeyVerifier::new(vec![old_key, new_key], "issuer", "audience")
    .with_cleanup_interval(Duration::from_secs(3600));

Implementations§

Source§

impl MultiKeyVerifier

Source

pub fn new( keys: Vec<RotationKey>, issuer: impl Into<String>, audience: impl Into<String>, ) -> Self

Create a new multi-key verifier

Source

pub fn from_single_key( key: VerifyingKey, key_id: impl Into<String>, issuer: impl Into<String>, audience: impl Into<String>, ) -> Self

Create from a single key (for backward compatibility)

Source

pub fn with_origin_validation(self) -> Self

Require origin validation

Source

pub fn with_cleanup_interval(self, interval: Duration) -> Self

Set cleanup interval for expired keys

Source

pub async fn add_key(&self, key: RotationKey)

Add a new key to the verifier

Source

pub async fn remove_key(&self, key_id: &str)

Remove a key by ID

Source

pub async fn key_ids(&self) -> Vec<String>

Get all key IDs

Source

pub async fn primary_key_id(&self) -> Option<String>

Get primary key ID

Source

pub async fn verify( &self, token: &str, expected_origin: Option<&str>, expected_client_ip: Option<&str>, ) -> Result<AuthContext, VerifyError>

Verify a token against all keys

Source

pub async fn verify_fast( &self, token: &str, expected_origin: Option<&str>, expected_client_ip: Option<&str>, ) -> Result<AuthContext, VerifyError>

Verify without cleaning up (for high-throughput scenarios)

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> 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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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