pub struct IntrospectionValidator {
pub client: Arc<dyn IntrospectionClient>,
pub principal_claim_name: String,
pub custom_claim_check: Option<JpQuery>,
pub call_userinfo: bool,
pub allowable_clock_skew: Time,
pub expected_audience: Option<String>,
pub fallback_user_name_claim: Option<String>,
pub fallback_user_name_prefix: Option<String>,
pub groups_claim: Option<JpQuery>,
pub groups_claim_delimiter: Option<String>,
}Expand description
RFC 7662 opaque-token introspection validator.
The validator calls the introspection endpoint once per token and does no caching. RFC 7662 §4 discourages caching without explicit lifetime info, and SASL runs once per connection, so the cost is acceptable.
After a successful introspection the validator can also call OIDC userinfo and merge the profile claims over the introspection claims.
Fields§
§client: Arc<dyn IntrospectionClient>§principal_claim_name: StringClaim whose string value becomes the principal name. Default sub
for generic OAuth flows; commonly client_id for Keycloak
client-credentials.
custom_claim_check: Option<JpQuery>Precompiled JsonPath custom_claim_check. See
UnsecuredJwsValidator for semantics. Introspection has no JWT
header, so there is no valid_token_type field here.
call_userinfo: booltrue iff a userinfo_endpoint_uri is configured. The validator then
calls client.userinfo(token) after a successful introspection and
merges the response over the introspection claims.
allowable_clock_skew: TimeClock-skew tolerance for exp/iat/nbf checks on
introspection-response timestamps, when present.
expected_audience: Option<String>When set, the introspection-response aud claim (RFC 7662 §2.2) must
contain this value. The default is None, which applies no audience
restriction. This check stops a token minted for another resource server
of the same IdP from authenticating here, even though that token still
introspects as active: true.
fallback_user_name_claim: Option<String>Alternate principal claim. See UnsecuredJwsValidator.
fallback_user_name_prefix: Option<String>Prepended to the principal name only on fallback.
groups_claim: Option<JpQuery>Precompiled JsonPath that extracts group memberships from the merged
claims, which are the introspection claims plus the optional userinfo
claims.
groups_claim_delimiter: Option<String>Delimiter when groups_claim resolves to a string.
Implementations§
Source§impl IntrospectionValidator
impl IntrospectionValidator
Sourcepub async fn validate(
&self,
token: &str,
now_ms: i64,
) -> Result<AuthOutcome, AuthError>
pub async fn validate( &self, token: &str, now_ms: i64, ) -> Result<AuthOutcome, AuthError>
Validate a bearer token with RFC 7662 introspection and optional userinfo enrichment.
§Errors
AuthError::IntrospectionTransporton HTTP transport / parse failures.AuthError::InvalidTokenonactive != true, missingexp, missing principal claim, scope mismatch, or temporal-claim failure.expis required so the SASL handler can populatesession_lifetime_msfor KIP-368 re-authentication.
Trait Implementations§
Source§impl Clone for IntrospectionValidator
impl Clone for IntrospectionValidator
Source§fn clone(&self) -> IntrospectionValidator
fn clone(&self) -> IntrospectionValidator
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl !RefUnwindSafe for IntrospectionValidator
impl !UnwindSafe for IntrospectionValidator
impl Freeze for IntrospectionValidator
impl Send for IntrospectionValidator
impl Sync for IntrospectionValidator
impl Unpin for IntrospectionValidator
impl UnsafeUnpin for IntrospectionValidator
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);