Add real email-based authentication, fix RC account auth to try all 3 login options when it doesn't know #20

This commit is contained in:
NG (Graham) committed 2025-05-11 21:18:55 -04:00
1 parent aea56bf01e
commit d3bd795a01
7 files changed
+82 -12

No files matched your search

+31
View File
@@ -0,0 +1,31 @@
use rc_core::UserAuthenticator;
use rocket::{post, routes, serde::json::Json, http::Status, State};
#[post("/authenticate/email/game", data = "<body>")]
pub async fn email_password_auth(body: Json<libfj::robocraft::EmailUserAuthenticationPayload>, config: &State<crate::common::cli::Config>) -> Result<Json<libfj::robocraft::AuthenticationResponseInfo>, Status> {
log::info!("Authenticating {} user {}", body.target, body.display_name);
let payload = libfj::robocraft::TokenPayload {
public_id: body.display_name.clone(),
display_name: body.display_name.clone(),
robocraft_name: body.display_name.clone(),
email_address: body.email_address.clone(),
email_verified: true,
flags: Vec::new(),
};
let user_info = rc_core::persist::user::UserInfo {
payload,
extra: rc_core::persist::user::ExtraUserInfo::Email { password: body.password.clone() },
};
let response = config.robocraft.account_provider.login(user_info).await
.map_err(|e| {
log::error!("Failed to authenticate {} user {}: {}", body.target, body.display_name, e);
Status { code: 401 }
})?;
Ok(Json(response.response))
}
pub fn stage() -> rocket::fairing::AdHoc {
rocket::fairing::AdHoc::on_ignite("Robocraft Username/Password", |rocket| async {
rocket.mount("/", routes![email_password_auth])
})
}
+2
View File
@@ -1,10 +1,12 @@
mod debug;
mod username;
mod steam;
mod email;
pub fn stage() -> rocket::fairing::AdHoc {
rocket::fairing::AdHoc::on_ignite("robocraft", |rocket| async {
rocket.attach(username::stage())
.attach(email::stage())
.attach(steam::stage())
.attach(debug::stage())
.register("/", rocket::catchers![unauthorized])
+4 -4
View File
@@ -2,7 +2,7 @@ use rc_core::UserAuthenticator;
use rocket::{post, routes, serde::json::Json, http::Status, State};
#[post("/authenticate/robocraft/game", data = "<body>")]
pub async fn email_password_auth(body: Json<libfj::robocraft::EmailUserAuthenticationPayload>, config: &State<crate::common::cli::Config>) -> Result<Json<libfj::robocraft::AuthenticationResponseInfo>, Status> {
pub async fn user_password_auth(body: Json<libfj::robocraft::EmailUserAuthenticationPayload>, config: &State<crate::common::cli::Config>) -> Result<Json<libfj::robocraft::AuthenticationResponseInfo>, Status> {
log::info!("Authenticating {} user {}", body.target, body.display_name);
let payload = libfj::robocraft::TokenPayload {
public_id: body.display_name.clone(),
@@ -14,7 +14,7 @@ pub async fn email_password_auth(body: Json<libfj::robocraft::EmailUserAuthentic
};
let user_info = rc_core::persist::user::UserInfo {
payload,
extra: rc_core::persist::user::ExtraUserInfo::Standalone { password: body.password.clone() },
extra: rc_core::persist::user::ExtraUserInfo::Username { password: body.password.clone() },
};
let response = config.robocraft.account_provider.login(user_info).await
.map_err(|e| {
@@ -25,7 +25,7 @@ pub async fn email_password_auth(body: Json<libfj::robocraft::EmailUserAuthentic
}
pub fn stage() -> rocket::fairing::AdHoc {
rocket::fairing::AdHoc::on_ignite("Robocraft Email/Password", |rocket| async {
rocket.mount("/", routes![email_password_auth])
rocket::fairing::AdHoc::on_ignite("Robocraft Username/Password", |rocket| async {
rocket.mount("/", routes![user_password_auth])
})
}