Skip to main content

ApiKeyCredential

Struct ApiKeyCredential 

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

Exchanges an application API key for short-lived Dex access tokens.

Use this when an application holds a long-lived API key and Dex requires bearer tokens. Use crate::FileCredential when another process writes ready-to-use tokens to a file. Unlike other Credential implementations, construction is async: ApiKeyCredentialBuilder::build performs the first exchange so an invalid key fails before Client or Worker creation. The synchronous Credential::token reads only the cache and never performs network I/O.

A background Tokio task refreshes at 80% of each token’s lifetime. Concurrent callers use the same cached token and only one exchange runs at a time. After a failed refresh, the current token remains usable until expiry and refresh is retried no more often than every five seconds. An expired token fails calls until a refresh succeeds. A unary Dex call rejected with gRPC Unauthenticated discards that exact token and retries once after a fresh exchange. Dex rejects unauthenticated calls before execution, so the retry is safe. Worker poll streams discard rejected tokens and reconnect once immediately. A second rejection uses the normal backoff.

The credential is safe to share across threads. Its background task is aborted when the last owner drops it. Client and Worker release their references when dropped; applications holding another Arc should drop that reference to stop refreshing. Keep the Tokio runtime used for construction alive and driving tasks while the credential is in use. A multi-thread runtime does this while it remains alive; a current-thread runtime must be continuously driven. Debug output and exchange errors omit the API key and access tokens.

use std::{sync::Arc, time::Duration};
use dex_sdk::{ApiKeyCredential, ClientOptions, WorkerOptions};
let runtime = tokio::runtime::Runtime::new()?;
let credential = Arc::new(runtime.block_on(ApiKeyCredential::builder(
    "https://auth.example.com/token", "my-dex-server", "application-api-key",
).exchange_timeout(Duration::from_secs(10)).build())?);
let client_options = ClientOptions::new().credential(credential.clone());
let worker_options = WorkerOptions::new().credential(credential);

Implementations§

Source§

impl ApiKeyCredential

Source

pub fn builder( token_url: impl Into<String>, server_id: impl Into<String>, api_key: impl Into<String>, ) -> ApiKeyCredentialBuilder

Starts configuration of an API-key credential.

token_url identifies the exchange endpoint. server_id scopes its access token, and api_key is the application secret. All three values are required. Validation and the first exchange occur in ApiKeyCredentialBuilder::build.

Trait Implementations§

Source§

impl Credential for ApiKeyCredential

Source§

fn token(&self) -> Result<String, CredentialError>

Returns the current bare token, or an error that fails the request locally. Read more
Source§

fn discard_rejected_token(&self, rejected_token: &str)

Discards a token rejected by Dex if it is still the credential’s cached token. Read more
Source§

fn token_after_rejection( &self, ) -> Option<Pin<Box<dyn Future<Output = Result<String, CredentialError>> + Send + '_>>>

Supplies an asynchronous fresh token after rejection when supported. Read more
Source§

impl Debug for ApiKeyCredential

Source§

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

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

impl Drop for ApiKeyCredential

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. 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<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> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

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

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + 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: Sized + 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 = !

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