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;
15use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine};
16pub(crate) use renew_token_request::*;
17
18mod auth_request_token_request;
19#[cfg(feature = "internal")]
20pub(crate) use auth_request_token_request::*;
21
22use crate::{
23    auth::{
24        api::response::{parse_identity_response, IdentityTokenResponse},
25        login::LoginError,
26    },
27    client::ApiConfigurations,
28    ApiError,
29};
30
31async fn send_identity_connect_request(
32    configurations: &ApiConfigurations,
33    email: Option<&str>,
34    body: impl serde::Serialize,
35) -> Result<IdentityTokenResponse, LoginError> {
36    let mut request = configurations
37        .identity
38        .client
39        .post(format!(
40            "{}/connect/token",
41            &configurations.identity.base_path
42        ))
43        .header(
44            reqwest::header::CONTENT_TYPE,
45            "application/x-www-form-urlencoded; charset=utf-8",
46        )
47        .header(reqwest::header::ACCEPT, "application/json")
48        .header("Device-Type", configurations.device_type as usize);
49
50    if let Some(ref user_agent) = configurations.identity.user_agent {
51        request = request.header(reqwest::header::USER_AGENT, user_agent.clone());
52    }
53
54    if let Some(email) = email {
55        request = request.header("Auth-Email", URL_SAFE_NO_PAD.encode(email.as_bytes()));
56    }
57
58    let response = request
59        .body(serde_qs::to_string(&body).expect("Serialize should be infallible"))
60        .send()
61        .await
62        .map_err(ApiError::from)?;
63
64    let status = response.status();
65    let text = response.text().await.map_err(ApiError::from)?;
66
67    parse_identity_response(status, text)
68}