use actix_web::cookie::{Cookie, SameSite};
use actix_web::{HttpResponse, HttpServer, get, post, web};
use r_token::{RTokenManager, RUser};
#[post("/login")]
async fn do_login(
manager: web::Data<RTokenManager>,
_body: String,
) -> Result<HttpResponse, r_token::RTokenError> {
let token = manager.login("121381", 3600)?; Ok(HttpResponse::Ok()
.cookie(
Cookie::build(r_token::TOKEN_COOKIE_NAME, token.clone())
.path("/")
.http_only(true)
.secure(true)
.same_site(SameSite::Lax)
.finish(),
)
.body(token))
}
#[get("/info")]
async fn do_info(user: RUser) -> impl actix_web::Responder {
format!("info: {}", user.id)
}
#[post("/logout")]
async fn do_logout(
manager: web::Data<crate::RTokenManager>,
user: RUser,
) -> Result<HttpResponse, r_token::RTokenError> {
manager.logout(&user.token)?;
Ok(HttpResponse::Ok().body("logout success"))
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let r_manager = r_token::RTokenManager::new();
println!("🚀 r-token server started at http://127.0.0.1:8080");
println!("📖 Try:");
println!(" POST http://127.0.0.1:8080/login");
println!(" GET http://127.0.0.1:8080/info (with Authorization header)");
println!(" POST http://127.0.0.1:8080/logout (with Authorization header)");
HttpServer::new(move || {
actix_web::App::new()
.app_data(web::Data::new(r_manager.clone()))
.service(do_login)
.service(do_info)
.service(do_logout)
})
.bind("127.0.0.1:8080")?
.run()
.await
}