drogue_client/openid/
inject.rs

1use crate::{
2    error::ClientError,
3    openid::{Credentials, TokenProvider},
4};
5use async_trait::async_trait;
6use tracing::instrument;
7
8/// Allows injecting tokens.
9#[async_trait]
10pub trait TokenInjector: Sized + Send + Sync {
11    async fn inject_token(self, token_provider: &dyn TokenProvider) -> Result<Self, ClientError>;
12}
13
14/// Injects tokens into a request by setting the authorization header to a "bearer" token.
15#[async_trait]
16impl TokenInjector for reqwest::RequestBuilder {
17    #[instrument(level = "debug", skip(token_provider), err)]
18    async fn inject_token(self, token_provider: &dyn TokenProvider) -> Result<Self, ClientError> {
19        if let Some(credentials) = token_provider
20            .provide_access_token()
21            .await
22            .map_err(|err| ClientError::Token(Box::new(err)))?
23        {
24            Ok(match credentials {
25                Credentials::Bearer(token) => self.bearer_auth(token),
26                Credentials::Basic(username, password) => self.basic_auth(username, password),
27            })
28        } else {
29            Ok(self)
30        }
31    }
32}