roblox_api/api/auth_token_service/
v1.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{DateTime, Error, client::Client};
4
5pub const URL: &str = "https://apis.roblox.com/auth-token-service/v1";
6
7// TODO: look into `qr-code-image`, `entercode`, `validatecode`, `metadata`
8
9#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
10pub enum LoginStatus {
11    Created,
12    Validated,
13}
14
15#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
16pub struct LoginToken {
17    #[serde(rename = "code")]
18    pub code: String,
19    #[serde(rename = "status")]
20    pub status: String,
21    #[serde(rename = "privateKey")]
22    pub private_key: String,
23    #[serde(rename = "expirationTime")]
24    pub expiration_time: DateTime,
25    #[serde(rename = "imagePath")]
26    pub image_path: String,
27}
28
29#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
30pub struct LoginTokenStatus {
31    #[serde(rename = "status")]
32    pub status: LoginStatus,
33    #[serde(rename = "accountName")]
34    pub account_name: Option<String>,
35    #[serde(rename = "accountPictureUrl")]
36    pub account_picture_url: Option<String>,
37    #[serde(rename = "expirationTime")]
38    pub expiration_time: String,
39}
40
41pub async fn login_create(client: &mut Client) -> Result<LoginToken, Error> {
42    let result = client
43        .requestor
44        .client
45        .post(format!("{URL}/login/create"))
46        .headers(client.requestor.default_headers.clone())
47        .send()
48        .await;
49
50    let response = client.validate_response(result).await?;
51    client.requestor.parse_json::<LoginToken>(response).await
52}
53
54pub async fn login_cancel(client: &mut Client, code: &str) -> Result<(), Error> {
55    #[derive(Serialize)]
56    struct Request<'a> {
57        code: &'a str,
58    }
59
60    let result = client
61        .requestor
62        .client
63        .post(format!("{URL}/login/cancel"))
64        .json(&Request { code })
65        .headers(client.requestor.default_headers.clone())
66        .send()
67        .await;
68
69    client.validate_response(result).await?;
70    Ok(())
71}
72
73pub async fn login_status(
74    client: &mut Client,
75    code: &str,
76    key: &str,
77) -> Result<LoginTokenStatus, Error> {
78    #[derive(Serialize)]
79    struct Request<'a> {
80        code: &'a str,
81        #[serde(rename = "privateKey")]
82        key: &'a str,
83    }
84
85    let result = client
86        .requestor
87        .client
88        .post(format!("{URL}/login/status"))
89        .json(&Request { code, key })
90        .headers(client.requestor.default_headers.clone())
91        .send()
92        .await;
93
94    let response = client.validate_response(result).await?;
95    client
96        .requestor
97        .parse_json::<LoginTokenStatus>(response)
98        .await
99}