bitwarden_core/auth/api/request/
mod.rs1#[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}