feat: authenticate
This commit is contained in:
commit
4fc017401f
5 changed files with 1619 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/target
|
||||
.env
|
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"rust-analyzer.cargo.features": "all"
|
||||
}
|
1523
Cargo.lock
generated
Normal file
1523
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
18
Cargo.toml
Normal file
18
Cargo.toml
Normal file
|
@ -0,0 +1,18 @@
|
|||
[package]
|
||||
name = "echoed"
|
||||
publish = false
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[features]
|
||||
dotenvy = ["dep:dotenvy"]
|
||||
|
||||
[dependencies]
|
||||
color-eyre = "0.6.3"
|
||||
cookie_store = "0.21.0"
|
||||
dotenvy = { version = "0.15.7", optional = true }
|
||||
ijson = "0.1.3"
|
||||
reqwest = { version = "0.12.9", features = ["json", "cookies", "multipart"] }
|
||||
reqwest_cookie_store = "0.8.0"
|
||||
tokio = { version = "1.41.0", features = ["macros", "rt-multi-thread"] }
|
||||
url = "2.5.2"
|
73
src/main.rs
Normal file
73
src/main.rs
Normal file
|
@ -0,0 +1,73 @@
|
|||
use color_eyre::eyre::eyre;
|
||||
use color_eyre::Result;
|
||||
use reqwest::multipart::Form;
|
||||
use reqwest::{Client, Url};
|
||||
use reqwest_cookie_store::CookieStoreMutex;
|
||||
use std::env;
|
||||
use std::sync::Arc;
|
||||
|
||||
const DEFAULT_BASE_URL: &str = "https://echo360.org.uk";
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
color_eyre::install()?;
|
||||
#[cfg(feature = "dotenvy")]
|
||||
dotenvy::dotenv()?;
|
||||
|
||||
let jar = Arc::new(CookieStoreMutex::default());
|
||||
let client = Client::builder().cookie_provider(jar.clone()).build()?;
|
||||
let base_url = Url::parse(DEFAULT_BASE_URL)?;
|
||||
let domain = base_url.domain().unwrap();
|
||||
|
||||
// get the csrf token
|
||||
client.get(base_url.clone()).send().await?;
|
||||
|
||||
let csrf_token = jar
|
||||
.lock()
|
||||
.unwrap()
|
||||
.get(domain, "/", "PLAY_SESSION")
|
||||
.map(|cookie| {
|
||||
let cookie_value = cookie.value().to_string();
|
||||
cookie_value
|
||||
.split("&")
|
||||
.nth(1)
|
||||
.map(|part| part.split("=").last())
|
||||
.flatten()
|
||||
.map(|x| x.to_string())
|
||||
})
|
||||
.flatten()
|
||||
.ok_or(eyre!("No csrf token found"))?;
|
||||
|
||||
// authenticate
|
||||
client
|
||||
.post(format!("{base_url}login"))
|
||||
.query(&[("csrfToken", csrf_token)])
|
||||
.multipart(
|
||||
Form::new()
|
||||
.text("email", env::var("ECHO360_EMAIL")?)
|
||||
.text("password", env::var("ECHO360_PASSWORD")?),
|
||||
)
|
||||
.send()
|
||||
.await?;
|
||||
|
||||
// get institution id
|
||||
let insitution_id = jar
|
||||
.lock()
|
||||
.unwrap()
|
||||
.get(domain, "/", "PLAY_SESSION")
|
||||
.map(|cookie| {
|
||||
let cookie_value = cookie.value().to_string();
|
||||
cookie_value
|
||||
.split("&")
|
||||
.nth(1)
|
||||
.map(|part| part.split("=").last())
|
||||
.flatten()
|
||||
.map(|x| x.to_string())
|
||||
})
|
||||
.flatten()
|
||||
.ok_or(eyre!("No institution id found"))?;
|
||||
|
||||
println!("Institution ID: {}", insitution_id);
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in a new issue