mirror of
https://github.com/storytold/artcraft.git
synced 2026-10-21 01:12:40 -04:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
867eceae52 |
+49
@@ -0,0 +1,49 @@
|
||||
|
||||
curl 'https://identitytoolkit.googleapis.com/v1/accounts:lookup?key=AIzaSyAA88yObUN-0pnXAxcgOrT2exZxFWLW1BI' \
|
||||
-H 'accept: */*' \
|
||||
-H 'accept-language: en-US,en;q=0.9' \
|
||||
-H 'content-type: application/json' \
|
||||
-H 'origin: https://marble.worldlabs.ai' \
|
||||
-H 'priority: u=1, i' \
|
||||
-H 'sec-ch-ua: "Google Chrome";v="143", "Chromium";v="143", "Not A(Brand";v="24"' \
|
||||
-H 'sec-ch-ua-mobile: ?0' \
|
||||
-H 'sec-ch-ua-platform: "macOS"' \
|
||||
-H 'sec-fetch-dest: empty' \
|
||||
-H 'sec-fetch-mode: cors' \
|
||||
-H 'sec-fetch-site: cross-site' \
|
||||
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36' \
|
||||
-H 'x-browser-channel: stable' \
|
||||
-H 'x-browser-copyright: Copyright 2025 Google LLC. All Rights reserved.' \
|
||||
-H 'x-browser-validation: AUXUCdutEJ+6gl6bYtz7E2kgIT4=' \
|
||||
-H 'x-browser-year: 2025' \
|
||||
-H 'x-client-data: CIe2yQEIorbJAQipncoBCKSCywEIlqHLAQiGoM0BCJSkzwE=' \
|
||||
-H 'x-client-version: Chrome/JsCore/12.6.0/FirebaseCore-web' \
|
||||
--data-raw '{"idToken":"eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk4OGQ1YTM3OWI3OGJkZjFlNTBhNDA5MTEzZjJiMGM3NWU0NTJlNDciLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vd2x0LXRyYWluaW5nLWdzYyIsImF1ZCI6IndsdC10cmFpbmluZy1nc2MiLCJhdXRoX3RpbWUiOjE3NjYwMDI5MjMsInVzZXJfaWQiOiJDQXJKSjJQUUZGZDhsMlJmOHVwdFpobDg2ZDMzIiwic3ViIjoiQ0FySkoyUFFGRmQ4bDJSZjh1cHRaaGw4NmQzMyIsImlhdCI6MTc2NjEyODA4NiwiZXhwIjoxNzY2MTMxNjg2LCJlbWFpbCI6InNhYmFsaWQyMzRAY3JzYXkuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImZpcmViYXNlIjp7ImlkZW50aXRpZXMiOnsiZW1haWwiOlsic2FiYWxpZDIzNEBjcnNheS5jb20iXX0sInNpZ25faW5fcHJvdmlkZXIiOiJwYXNzd29yZCJ9fQ.T1V-C-5dyNorLKXIE4aqi76RvwU5Fdw-YH0YOU_TQb7nNgKy1HsmQswssBFHw4KP2DKjvbZif4TIFJQTnsYAfCh1VvOVtHFUY-kGTRSU5wLPUbH_1EiOLgletGP6YeM3MiZq8fWG1VSWe6xmogmTfhSf3NcRW46L6GeJLXmJXPrHl6Hxszvr1aSmxm1Ee412bCN2hhgGcmTYm7-jaeT9MdnKddu-wv_5Bd6Eb5kCXZHvZIqgaWR_5ACMJq7zyefrCZUSISh3jTycRsVaFKvv09Mm_rJHFQbV2FXCNDx4S80nR7TyUd8SDehKiGsPRgUq-mGvCPBabk0dpAn73LAFrA"}'
|
||||
|
||||
|
||||
Response:
|
||||
|
||||
{
|
||||
"kind": "identitytoolkit#GetAccountInfoResponse",
|
||||
"users": [
|
||||
{
|
||||
"localId": "CArJJ2PQFFd8l2Rf8uptZhl86d33",
|
||||
"email": "sabalid234@crsay.com",
|
||||
"passwordHash": "UkVEQUNURUQ=",
|
||||
"emailVerified": true,
|
||||
"passwordUpdatedAt": 1765756496440,
|
||||
"providerUserInfo": [
|
||||
{
|
||||
"providerId": "password",
|
||||
"federatedId": "sabalid234@crsay.com",
|
||||
"email": "sabalid234@crsay.com",
|
||||
"rawId": "sabalid234@crsay.com"
|
||||
}
|
||||
],
|
||||
"validSince": "1765756496",
|
||||
"lastLoginAt": "1766098175534",
|
||||
"createdAt": "1765756496440",
|
||||
"lastRefreshAt": "2025-12-19T07:08:06.869541Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
|
||||
https://securetoken.googleapis.com/v1/token?key={REFRESH_TOKEN}
|
||||
|
||||
curl 'https://securetoken.googleapis.com/v1/token?key=AIzaSyAA88yObUN-0pnXAxcgOrT2exZxFWLW1BI' \
|
||||
--compressed \
|
||||
-X POST \
|
||||
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0' \
|
||||
-H 'Accept: */*' \
|
||||
-H 'Accept-Language: en-US,en;q=0.5' \
|
||||
-H 'Accept-Encoding: gzip, deflate, br, zstd' \
|
||||
-H 'Referer: https://marble.worldlabs.ai/' \
|
||||
-H 'X-Client-Version: Firefox/JsCore/12.6.0/FirebaseCore-web' \
|
||||
-H 'X-Firebase-Client: eyJ2ZXJzaW9uIjoyLCJoZWFydGJlYXRzIjpbeyJhZ2VudCI6ImZpcmUtY29yZS8wLjE0LjYgZmlyZS1jb3JlLWVzbTIwMjAvMC4xNC42IGZpcmUtanMvIGZpcmUtanMtYWxsLWFwcC8xMi42LjAgZmlyZS1hdXRoLzEuMTEuMSBmaXJlLWF1dGgtZXNtMjAyMC8xLjExLjEiLCJkYXRlcyI6WyIyMDI1LTEyLTE5Il19XX0' \
|
||||
-H 'Content-Type: application/x-www-form-urlencoded' \
|
||||
-H 'Origin: https://marble.worldlabs.ai' \
|
||||
-H 'Connection: keep-alive' \
|
||||
-H 'Sec-Fetch-Dest: empty' \
|
||||
-H 'Sec-Fetch-Mode: cors' \
|
||||
-H 'Sec-Fetch-Site: cross-site' \
|
||||
-H 'Priority: u=4' \
|
||||
-H 'TE: trailers' \
|
||||
--data-raw 'grant_type=refresh_token&refresh_token=AMf-vByUgA0J9S93vULECe-sD50cbR85AFVYF60gKAmLFF1MBYwXlKRJCsv7z3oSpLtP0ApyOU5fAl52qHWM2U0yKgEu5gQ5UCUDt5SEG4UBRHWvHEmLLcu-Zl04Fq4ljocSEO3qJzuX1wyshmptZxlDPRkjdLYgyn-Kp03woI2yRPKLuQF5hQtABHabsNUh9Zhs129sgxuUlOuw4zsFI4L8UdE3bEuF3k6Mic7KlE3440YwyQ8Qtmk9zHtXIx2ob56N-1WTGSqwMUuQ1mX4OOvLve9bw2zDW3UzchomTWkh732886RPrP-DNRkPbO3FejUEMxuYQFWYX3EEeIEdfNGXFNGPL1dNniSXlSaKadpX699Ishjviv-x9o-pPQa3zoAj3NzWLyd8mn5rDBh9qAO_iDETaeo01Sjhb4mGYfAWZ-g4S6nW778'
|
||||
|
||||
--data-raw '
|
||||
grant_type=refresh_token
|
||||
&refresh_token=AMf-vByUgA0J9S93vULECe-sD50cbR85AFVYF60gKAmLFF1MBYwXlKRJCsv7z3oSpLtP0ApyOU5fAl52qHWM2U0yKgEu5gQ5UCUDt5SEG4UBRHWvHEmLLcu-Zl04Fq4ljocSEO3qJzuX1wyshmptZxlDPRkjdLYgyn-Kp03woI2yRPKLuQF5hQtABHabsNUh9Zhs129sgxuUlOuw4zsFI4L8UdE3bEuF3k6Mic7KlE3440YwyQ8Qtmk9zHtXIx2ob56N-1WTGSqwMUuQ1mX4OOvLve9bw2zDW3UzchomTWkh732886RPrP-DNRkPbO3FejUEMxuYQFWYX3EEeIEdfNGXFNGPL1dNniSXlSaKadpX699Ishjviv-x9o-pPQa3zoAj3NzWLyd8mn5rDBh9qAO_iDETaeo01Sjhb4mGYfAWZ-g4S6nW778
|
||||
|
||||
|
||||
Response:
|
||||
|
||||
{
|
||||
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk4OGQ1YTM3OWI3OGJkZjFlNTBhNDA5MTEzZjJiMGM3NWU0NTJlNDciLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiQnJhbmRvbiBUaG9tYXMiLCJwaWN0dXJlIjoiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EvQUNnOG9jS0lucl8yWGJ2Z1VERUxNOEpCTGdfa2tKbVpxWl9WcTlzZkI2bVR4VmQzc1NJRk4tST1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2MDE3Nzk3OCwidXNlcl9pZCI6IjA1c0dhaHRySWdVMjVMaXR5NjhoZjRpMmV4SjIiLCJzdWIiOiIwNXNHYWh0cklnVTI1TGl0eTY4aGY0aTJleEoyIiwiaWF0IjoxNzY2MTI2ODg4LCJleHAiOjE3NjYxMzA0ODgsImVtYWlsIjoiYnRAYnJhbmQuaW8iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjEwNjEwODI2NzgzNTYyOTEwMTc1OSJdLCJlbWFpbCI6WyJidEBicmFuZC5pbyJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.YLXZHg0rzMzyhhyJsO3DSMhU8GjnxtQtg1GiDwaxZjuybmabqOcR_b4C2lE2XwESg_dDYnIkmdas9wsHshy2bGPCAAtrinQpxTHWhIDxy0bsF8yW0BCOszwVseiTkXd6vveaGYH06EvH-nM4Q5AB_oKbsgRyMEbXhepvX7SlrmeaXxqldCLRalDj6gcEIY_TSwMmjnZ6-sFMPe92YjLY1ITPRx7S3YyWNwBG6mVpgoHcHudNAJ4TFxborZlhC1zpF0NDgtIhN5ITg0I1P0A-JTaBTJHukQwCPKhifFRA1kfcxzbAoZyPiPw2DdgXpDDnNzXUYgnaOOVyGs96Tx8hOQ",
|
||||
"expires_in": "3600",
|
||||
"token_type": "Bearer",
|
||||
"refresh_token": "AMf-vByUgA0J9S93vULECe-sD50cbR85AFVYF60gKAmLFF1MBYwXlKRJCsv7z3oSpLtP0ApyOU5fAl52qHWM2U0yKgEu5gQ5UCUDt5SEG4UBRHWvHEmLLcu-Zl04Fq4ljocSEO3qJzuX1wyshmptZxlDPRkjdLYgyn-Kp03woI2yRPKLuQF5hQtABHabsNUh9Zhs129sgxuUlOuw4zsFI4L8UdE3bEuF3k6Mic7KlE3440YwyQ8Qtmk9zHtXIx2ob56N-1WTGSqwMUuQ1mX4OOvLve9bw2zDW3UzchomTWkh732886RPrP-DNRkPbO3FejUEMxuYQFWYX3EEeIEdfNGXFNGPL1dNniSXlSaKadpX699Ishjviv-x9o-pPQa3zoAj3NzWLyd8mn5rDBh9qAO_iDETaeo01Sjhb4mGYfAWZ-g4S6nW778",
|
||||
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk4OGQ1YTM3OWI3OGJkZjFlNTBhNDA5MTEzZjJiMGM3NWU0NTJlNDciLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiQnJhbmRvbiBUaG9tYXMiLCJwaWN0dXJlIjoiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EvQUNnOG9jS0lucl8yWGJ2Z1VERUxNOEpCTGdfa2tKbVpxWl9WcTlzZkI2bVR4VmQzc1NJRk4tST1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS93bHQtdHJhaW5pbmctZ3NjIiwiYXVkIjoid2x0LXRyYWluaW5nLWdzYyIsImF1dGhfdGltZSI6MTc2MDE3Nzk3OCwidXNlcl9pZCI6IjA1c0dhaHRySWdVMjVMaXR5NjhoZjRpMmV4SjIiLCJzdWIiOiIwNXNHYWh0cklnVTI1TGl0eTY4aGY0aTJleEoyIiwiaWF0IjoxNzY2MTI2ODg4LCJleHAiOjE3NjYxMzA0ODgsImVtYWlsIjoiYnRAYnJhbmQuaW8iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjEwNjEwODI2NzgzNTYyOTEwMTc1OSJdLCJlbWFpbCI6WyJidEBicmFuZC5pbyJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.YLXZHg0rzMzyhhyJsO3DSMhU8GjnxtQtg1GiDwaxZjuybmabqOcR_b4C2lE2XwESg_dDYnIkmdas9wsHshy2bGPCAAtrinQpxTHWhIDxy0bsF8yW0BCOszwVseiTkXd6vveaGYH06EvH-nM4Q5AB_oKbsgRyMEbXhepvX7SlrmeaXxqldCLRalDj6gcEIY_TSwMmjnZ6-sFMPe92YjLY1ITPRx7S3YyWNwBG6mVpgoHcHudNAJ4TFxborZlhC1zpF0NDgtIhN5ITg0I1P0A-JTaBTJHukQwCPKhifFRA1kfcxzbAoZyPiPw2DdgXpDDnNzXUYgnaOOVyGs96Tx8hOQ",
|
||||
"user_id": "05sGahtrIgU25Lity68hf4i2exJ2",
|
||||
"project_id": "661553802735"
|
||||
}
|
||||
|
||||
+154
@@ -0,0 +1,154 @@
|
||||
use crate::api::api_types::upload_mime_type::UploadMimeType;
|
||||
use crate::api::common::common_header_values::{ORIGIN_VALUE, REFERER_VALUE};
|
||||
use crate::credentials::world_labs_bearer_token::WorldLabsBearerToken;
|
||||
use crate::credentials::world_labs_cookies::WorldLabsCookies;
|
||||
use crate::credentials::worldlabs_refresh_token::WorldLabsRefreshToken;
|
||||
use crate::error::world_labs_client_error::WorldLabsClientError;
|
||||
use crate::error::world_labs_error::WorldLabsError;
|
||||
use crate::error::world_labs_generic_api_error::WorldLabsGenericApiError;
|
||||
use crate::error::world_labs_specific_api_error::WorldLabsSpecificApiError;
|
||||
use http_headers::names::{PRIORITY, SEC_FETCH_DEST, SEC_FETCH_MODE, SEC_FETCH_SITE, SEC_GPC};
|
||||
use http_headers::values::accept::ACCEPT_ALL;
|
||||
use http_headers::values::accept_encoding::ACCEPT_ENCODING_GZIP_ETC;
|
||||
use http_headers::values::accept_language::ACCEPT_LANGUAGE_EN_US;
|
||||
use http_headers::values::cache_control::CACHE_CONTROL_NO_CACHE;
|
||||
use http_headers::values::connection::CONNECTION_KEEP_ALIVE;
|
||||
use http_headers::values::pragma::PRAGMA_NO_CACHE;
|
||||
use http_headers::values::priority::{PRIORITY_4, PRIORITY_6};
|
||||
use http_headers::values::sec::{SEC_FETCH_DEST_EMPTY, SEC_FETCH_MODE_CORS, SEC_FETCH_SITE_CROSS_SITE};
|
||||
use http_headers::values::te::TE_TRAILERS;
|
||||
use log::{debug, error};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::collections::HashMap;
|
||||
use std::time::Duration;
|
||||
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, AUTHORIZATION, CACHE_CONTROL, CONNECTION, CONTENT_LENGTH, CONTENT_TYPE, ORIGIN, PRAGMA, REFERER, TE};
|
||||
use wreq::multipart::Form;
|
||||
use wreq::Client;
|
||||
use wreq_util::Emulation;
|
||||
|
||||
/// NB: key is the public API key for WorldLabs
|
||||
/// https://docs.cloud.google.com/identity-platform/docs/use-rest-api
|
||||
const URL : &str = "https://securetoken.googleapis.com/v1/token?key=AIzaSyAA88yObUN-0pnXAxcgOrT2exZxFWLW1BI";
|
||||
pub struct GoogleRefreshTokenArgs<'a> {
|
||||
pub refresh_token: &'a WorldLabsRefreshToken,
|
||||
pub request_timeout: Option<Duration>,
|
||||
}
|
||||
|
||||
pub struct GoogleRefreshTokenResponse {
|
||||
pub bearer_token: WorldLabsBearerToken,
|
||||
pub refresh_token: WorldLabsRefreshToken,
|
||||
}
|
||||
|
||||
/// Refresh Access Token for WorldLabs using Google.
|
||||
pub async fn google_refresh_token(args: GoogleRefreshTokenArgs<'_>) -> Result<GoogleRefreshTokenResponse, WorldLabsError> {
|
||||
let client = Client::builder()
|
||||
.emulation(Emulation::Firefox143)
|
||||
.build()
|
||||
.map_err(|err| WorldLabsClientError::WreqClientError(err))?;
|
||||
|
||||
|
||||
debug!("Requesting URL: {}", URL);
|
||||
|
||||
let mut request_builder = client.post(URL)
|
||||
.header(ACCEPT, ACCEPT_ALL)
|
||||
.header(ACCEPT_LANGUAGE, ACCEPT_LANGUAGE_EN_US)
|
||||
.header(ACCEPT_ENCODING, ACCEPT_ENCODING_GZIP_ETC)
|
||||
.header(REFERER, REFERER_VALUE)
|
||||
.header(CONNECTION, CONNECTION_KEEP_ALIVE)
|
||||
.header(SEC_FETCH_DEST, SEC_FETCH_DEST_EMPTY)
|
||||
.header(SEC_FETCH_MODE, SEC_FETCH_MODE_CORS)
|
||||
.header(SEC_FETCH_SITE, SEC_FETCH_SITE_CROSS_SITE)
|
||||
.header(PRIORITY, PRIORITY_4)
|
||||
.header(TE, TE_TRAILERS);
|
||||
|
||||
let mut form = HashMap::new();
|
||||
form.insert("grant_type", "refresh_token".to_string());
|
||||
form.insert("refresh_token", args.refresh_token.to_raw_string());
|
||||
|
||||
if let Some(timeout) = args.request_timeout {
|
||||
request_builder = request_builder.timeout(timeout);
|
||||
}
|
||||
|
||||
let http_request = request_builder
|
||||
.form(&form)
|
||||
.build()
|
||||
.map_err(|err| {
|
||||
error!("Error building request: {:?}", err);
|
||||
WorldLabsClientError::WreqClientError(err)
|
||||
})?;
|
||||
|
||||
let response = client.execute(http_request)
|
||||
.await
|
||||
.map_err(|err| {
|
||||
error!("Error during request execution: {:?}", err);
|
||||
WorldLabsGenericApiError::WreqError(err)
|
||||
})?;
|
||||
|
||||
let status = response.status();
|
||||
|
||||
let response_body = response.text()
|
||||
.await
|
||||
.map_err(|err| {
|
||||
error!("Error reading response body: {:?}", err);
|
||||
WorldLabsGenericApiError::WreqError(err)
|
||||
})?;
|
||||
|
||||
if !status.is_success() {
|
||||
error!("Request returned an error (code {}) : {:?}", status.as_u16(), response_body);
|
||||
|
||||
if response_body.contains("SignatureDoesNotMatch") || response_body.contains("does not match the signature") {
|
||||
return Err(WorldLabsSpecificApiError::GoogleUploadSignatureDoesNotMatch.into());
|
||||
} else {
|
||||
return Err(WorldLabsGenericApiError::GoogleUploadFailed { status_code: status, body: response_body }.into());
|
||||
}
|
||||
}
|
||||
|
||||
debug!("Response body (200): {}", response_body);
|
||||
|
||||
let response : RawResponse = serde_json::from_str(&response_body)
|
||||
.map_err(|err| WorldLabsGenericApiError::SerdeResponseParseErrorWithBody(err, response_body.to_string()))?;
|
||||
|
||||
let bearer_token = WorldLabsBearerToken::new(response.access_token);
|
||||
let refresh_token = WorldLabsRefreshToken::new(response.refresh_token);
|
||||
|
||||
Ok(GoogleRefreshTokenResponse {
|
||||
bearer_token,
|
||||
refresh_token,
|
||||
})
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct RawResponse {
|
||||
pub access_token: String,
|
||||
pub refresh_token: String,
|
||||
|
||||
// eg. "3600"
|
||||
pub expires_in: Option<String>,
|
||||
pub id_token: Option<String>,
|
||||
pub user_id: Option<String>,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::api::requests::google_refresh_token::google_refresh_token::{google_refresh_token, GoogleRefreshTokenArgs};
|
||||
use crate::credentials::worldlabs_refresh_token::WorldLabsRefreshToken;
|
||||
use crate::test_utils::setup_test_logging::setup_test_logging;
|
||||
use errors::AnyhowResult;
|
||||
use log::LevelFilter;
|
||||
|
||||
#[tokio::test]
|
||||
#[ignore] // Client side tests only
|
||||
async fn test_requests() -> AnyhowResult<()> {
|
||||
setup_test_logging(LevelFilter::Debug);
|
||||
|
||||
let refresh_token = "AMf-vByUgA0J9S93vULECe-sD50cbR85AFVYF60gKAmLFF1MBYwXlKRJCsv7z3oSpLtP0ApyOU5fAl52qHWM2U0yKgEu5gQ5UCUDt5SEG4UBRHWvHEmLLcu-Zl04Fq4ljocSEO3qJzuX1wyshmptZxlDPRkjdLYgyn-Kp03woI2yRPKLuQF5hQtABHabsNUh9Zhs129sgxuUlOuw4zsFI4L8UdE3bEuF3k6Mic7KlE3440YwyQ8Qtmk9zHtXIx2ob56N-1WTGSqwMUuQ1mX4OOvLve9bw2zDW3UzchomTWkh732886RPrP-DNRkPbO3FejUEMxuYQFWYX3EEeIEdfNGXFNGPL1dNniSXlSaKadpX699Ishjviv-x9o-pPQa3zoAj3NzWLyd8mn5rDBh9qAO_iDETaeo01Sjhb4mGYfAWZ-g4S6nW778";
|
||||
let refresh_token = WorldLabsRefreshToken::new(refresh_token.to_string());
|
||||
|
||||
let result = google_refresh_token(GoogleRefreshTokenArgs {
|
||||
refresh_token: &refresh_token,
|
||||
request_timeout: None,
|
||||
}).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
pub mod google_refresh_token;
|
||||
@@ -1,4 +1,5 @@
|
||||
pub mod google_upload;
|
||||
pub mod objects;
|
||||
pub mod recaption;
|
||||
pub mod worlds;
|
||||
pub mod worlds;
|
||||
pub mod google_refresh_token;
|
||||
@@ -0,0 +1,5 @@
|
||||
|
||||
|
||||
/// Accept-Encoding
|
||||
/// Sent by Firefox for en-US on Mac
|
||||
pub const ACCEPT_ENCODING_GZIP_ETC : &str = "gzip, deflate, br, zstd";
|
||||
@@ -0,0 +1,4 @@
|
||||
|
||||
/// Accept-Language
|
||||
/// Sent by Firefox for en-US on Mac
|
||||
pub const ACCEPT_LANGUAGE_EN_US: &str = "en-US,en;q=0.5";
|
||||
@@ -1,4 +1,6 @@
|
||||
pub mod accept;
|
||||
pub mod accept_encoding;
|
||||
pub mod accept_language;
|
||||
pub mod cache_control;
|
||||
pub mod connection;
|
||||
pub mod content_type;
|
||||
|
||||
Reference in New Issue
Block a user