2025-04-01 19:38:03 -04:00
|
|
|
use rc_core::UserAuthenticator;
|
|
|
|
|
use rocket::{post, routes, serde::json::Json, http::Status, State};
|
2025-01-27 19:52:57 -05:00
|
|
|
|
2025-04-01 19:38:03 -04:00
|
|
|
#[post("/authenticate/robocraft/game", data = "<body>")]
|
2025-05-07 20:23:22 -04:00
|
|
|
pub async fn email_password_auth(body: Json<libfj::robocraft::EmailUserAuthenticationPayload>, config: &State<crate::common::cli::Config>) -> Result<Json<libfj::robocraft::AuthenticationResponseInfo>, Status> {
|
2025-04-01 19:38:03 -04:00
|
|
|
log::info!("Authenticating {} user {}", body.target, body.display_name);
|
2025-01-27 19:52:57 -05:00
|
|
|
let payload = libfj::robocraft::TokenPayload {
|
2025-04-01 19:38:03 -04:00
|
|
|
public_id: body.display_name.clone(),
|
|
|
|
|
display_name: body.display_name.clone(),
|
|
|
|
|
robocraft_name: body.display_name.clone(),
|
|
|
|
|
email_address: body.email_address.clone(),
|
2025-01-27 19:52:57 -05:00
|
|
|
email_verified: true,
|
|
|
|
|
flags: Vec::new(),
|
|
|
|
|
};
|
2025-04-01 19:38:03 -04:00
|
|
|
let user_info = rc_core::persist::user::UserInfo {
|
|
|
|
|
payload,
|
|
|
|
|
extra: rc_core::persist::user::ExtraUserInfo::Standalone { password: body.password.clone() },
|
|
|
|
|
};
|
2025-05-07 20:23:22 -04:00
|
|
|
let response = config.robocraft.account_provider.login(user_info).await
|
2025-04-01 19:38:03 -04:00
|
|
|
.map_err(|e| {
|
|
|
|
|
log::error!("Failed to authenticate {} user {}: {}", body.target, body.display_name, e);
|
|
|
|
|
Status { code: 401 }
|
|
|
|
|
})?;
|
|
|
|
|
Ok(Json(response.response))
|
2025-01-27 19:52:57 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn stage() -> rocket::fairing::AdHoc {
|
|
|
|
|
rocket::fairing::AdHoc::on_ignite("Robocraft Email/Password", |rocket| async {
|
|
|
|
|
rocket.mount("/", routes![email_password_auth])
|
|
|
|
|
})
|
|
|
|
|
}
|