Implement PKCE for Mastodon auth
Dependencies
- [2]
BXEBSO25Update base64 dependency - [3]
46JE6BRGUpdate pct_str - [4]
LTQCLSBUSplit database usage in pages - [5]
WVHXYKCVAdd postgresql pools - [6]
H6GGDVHWShow auth info in reset password page - [7]
4TRDTVC4Fix login page - [8]
G4JCZ5F7Store try to register on Mastodon domain - [9]
TEB4R7OUAdd form to join game - [10]
KDKRTAYJRegister application on Mastodon domain - [11]
FUCFD4UVAdd log in and log out support - [12]
HTYEGVBUAdd data to reset password page - [13]
HBDTKI2BAdd auth info to password reset - [14]
MGRTVGLJRedirect to Mastodon domain - [15]
W2AVMCLOLog in with Mastodon - [16]
564OK4ZCAdd state parameter to Mastodon query - [*]
WW3KRXX6Add page for reset game password - [*]
EVP2FSBHSplit index page - [*]
4MZ4VIR7Initial commit - [*]
BCXEUKX6Add config, static files and web server - [*]
CMA5SKJ3Copy turns Atom generator
Change contents
- replacement in src/templates/login.html at line 30
<legend>Social Auth with Mastodon (not yet supported)</legend><legend>Social Auth with Mastodon</legend> - replacement in src/pages/reset_game_pwd.rs at line 42
let token = match Uuid::parse_str(&token.into_inner()) {let token = match Uuid::parse_str(&token.into_inner().replace("=", "")) { - replacement in src/pages/mod.rs at line 50
pub cache_mastodon_state: Mutex<TtlCache<String, String>>,pub cache_mastodon_state: Mutex<TtlCache<String, (String, String)>>, - edit in src/pages/log_in.rs at line 5
use rand::{rng, RngExt};use sha2::{Digest, Sha256}; - edit in src/pages/log_in.rs at line 10
use base64::Engine; - edit in src/pages/log_in.rs at line 260
code_verifier: &str, - replacement in src/pages/log_in.rs at line 268
"client_id={}&client_secret={}&redirect_uri={}&grant_type=authorization_code&code={}&scopes=read:accounts","client_id={}&client_secret={}&redirect_uri={}&grant_type=authorization_code&code={}&scopes=read:accounts&code_verifier={}", - replacement in src/pages/log_in.rs at line 272
pct_str::PctString::encode(code.chars(), pct_str::UriReserved::Any).as_str()pct_str::PctString::encode(code.chars(), pct_str::UriReserved::Any).as_str(),code_verifier - edit in src/pages/log_in.rs at line 560
let mut random_bytes = [0u8; 32];rng().fill(&mut random_bytes);let code_verifier = base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(random_bytes);let mut hasher = Sha256::new();hasher.update(code_verifier.as_bytes());let code_challenge = base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(hasher.finalize()); - replacement in src/pages/log_in.rs at line 569
let location = format!("https://{}/oauth/authorize?client_id={}&scope=read:accounts&redirect_uri={}&response_type=code&state={}",let location = format!("https://{}/oauth/authorize?client_id={}&scope=read:accounts&redirect_uri={}&response_type=code&state={}&code_challenge_method=S256&code_challenge={}", - replacement in src/pages/log_in.rs at line 573
state);state,code_challenge); - replacement in src/pages/log_in.rs at line 580
domain,(domain, code_verifier), - replacement in src/pages/log_in.rs at line 629
if cached_data.is_none_or(|x| x != domain) {log::warn!("Unknown state for mastodon redirect: {}", state);return HttpResponse::BadRequest().body("Incorrect");}let code_verifier = match cached_data {None => {log::warn!("Unknown state for mastodon redirect: {}", state);return HttpResponse::BadRequest().body("Incorrect");}Some((cached_domain, code_verifier)) => {if cached_domain != domain {log::warn!("Unknown domain and state for mastodon redirect: {} domain {} != {}",state,domain,cached_domain);return HttpResponse::BadRequest().body("Incorrect");} else {code_verifier}}}; - edit in src/pages/log_in.rs at line 692
&code_verifier, - edit in Cargo.toml at line 29
[dependencies.rand]version = "0.10"features = ["thread_rng"] - edit in Cargo.lock at line 1004[22.4438][21.20518]
"rand 0.10.1",