bitwarden_core/auth/api/request/
mod.rs

1#[cfg(feature = "secrets")]
2mod access_token_request;
3#[cfg(feature = "secrets")]
4pub(crate) use access_token_request::*;
5
6mod api_token_request;
7pub(crate) use api_token_request::*;
8
9#[cfg(feature = "internal")]
10mod password_token_request;
11#[cfg(feature = "internal")]
12pub(crate) use password_token_request::*;
13
14mod renew_token_request;
15pub(crate) use renew_token_request::*;
16
17mod auth_request_token_request;
18#[cfg(feature = "internal")]
19pub(crate) use auth_request_token_request::*;
20
21use crate::{
22    ApiError,
23    auth::{
24        api::response::{IdentityTokenResponse, parse_identity_response},
25        login::LoginError,
26    },
27    client::ApiConfigurations,
28};
29
30pub(crate) async fn send_identity_connect_request(
31    configurations: &ApiConfigurations,
32    body: impl serde::Serialize,
33) -> Result<IdentityTokenResponse, LoginError> {
34    let config = &configurations.identity_config;
35
36    let mut request = config
37        .client
38        .post(format!("{}/connect/token", &config.base_path))
39        .header(
40            reqwest::header::CONTENT_TYPE,
41            "application/x-www-form-urlencoded; charset=utf-8",
42        )
43        .header(reqwest::header::ACCEPT, "application/json")
44        .header("Device-Type", configurations.device_type as usize);
45
46    if let Some(ref user_agent) = config.user_agent {
47        request = request.header(reqwest::header::USER_AGENT, user_agent.clone());
48    }
49
50    let response = request
51        .body(serde_qs::to_string(&body).expect("Serialize should be infallible"))
52        .send()
53        .await
54        .map_err(ApiError::from)?;
55
56    let status = response.status();
57    let text = response.text().await.map_err(ApiError::from)?;
58
59    parse_identity_response(status, text)
60}