mas_oidc_client/requests/
token.rs1use chrono::{DateTime, Utc};
11use http::header::ACCEPT;
12use mas_http::RequestBuilderExt;
13use mime::APPLICATION_JSON;
14use oauth2_types::requests::{AccessTokenRequest, AccessTokenResponse};
15use rand::RngExt;
16use url::Url;
17
18use crate::{
19 error::{ResponseExt, TokenRequestError},
20 types::client_credentials::ClientCredentials,
21};
22
23#[tracing::instrument(skip_all, fields(token_endpoint, request))]
44pub async fn request_access_token(
45 http_client: &reqwest::Client,
46 client_credentials: ClientCredentials,
47 token_endpoint: &Url,
48 request: AccessTokenRequest,
49 now: DateTime<Utc>,
50 rng: &mut impl RngExt,
51) -> Result<AccessTokenResponse, TokenRequestError> {
52 tracing::debug!(?request, "Requesting access token...");
53
54 let token_request = http_client
55 .post(token_endpoint.as_str())
56 .header(ACCEPT, APPLICATION_JSON.as_ref());
57
58 let token_response = client_credentials
59 .authenticated_form(token_request, &request, now, rng)?
60 .send_traced()
61 .await?
62 .error_from_oauth2_error_response()
63 .await?
64 .json()
65 .await?;
66
67 Ok(token_response)
68}