use axum::{ routing::{get, post}, Router, }; use entities::*; use services::{ auth::{self, finish_authentication, start_authentication}, gc_task, login, login_page, register_page, }; use std::net::SocketAddr; use std::sync::Arc; use tower_cookies::CookieManagerLayer; use tower_http::trace::{self, TraceLayer}; use tower_sessions::{Expiry, MemoryStore, SessionManagerLayer}; use tracing::Level; pub mod config; pub mod controllers; pub mod entities; pub mod services; use config::{HOME_URL, PORT}; use crate::config::*; #[tokio::main] async fn main() { // 初始化日志记录器 tracing_subscriber::fmt::init(); let session_store = MemoryStore::default(); let session_layer = SessionManagerLayer::new(session_store) .with_secure(false) .with_expiry(Expiry::OnSessionEnd); let state = Arc::new(ServerState::new().await); let app = Router::new() .route("/auth", get(crate::services::auth_otp)) // http://127.0.0.1:3000 .route("/login", get(login_page).post(login)) .route("/register", get(register_page)) .route("/register_start/:username", post(auth::start_register)) .route("/register_finish", post(auth::finish_register)) .route( "/webauthn_login_start/:username", post(start_authentication), ) .route("/webauthn_login_finish", post(finish_authentication)) .layer( TraceLayer::new_for_http() .make_span_with(trace::DefaultMakeSpan::new().level(Level::INFO)) .on_response(trace::DefaultOnResponse::new().level(Level::INFO)), ) .with_state(state.clone()) .layer(CookieManagerLayer::new()) .layer(session_layer); // 嵌套防止撞路由 let aaronhu = Router::new().nest(&HOME_URL, app); let port = PORT.parse::().unwrap_or(3000); let addr = SocketAddr::from(([127, 0, 0, 1], port)); // run it with hyper on localhost:3000 tokio::spawn(gc_task(state.clone())); let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); tracing::info!( "配置如下 COOKIE_DOMAIN={}\nRP_ID={}\nRP_ORIGIN={}\nCOOKIE_NAME={}\n", COOKIE_DOMAIN.to_string(), RP_ID.to_string(), RP_ORIGIN.to_string(), COOKIE_NAME.to_string() ); axum::serve(listener, aaronhu).await.unwrap(); }