69 lines
2.3 KiB
Rust
69 lines
2.3 KiB
Rust
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::<u16>().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();
|
|
}
|