use log::error;
use rocket::{
form::Form,
get,
http::{uri::Absolute, Status},
launch, post,
response::{content::RawHtml, Redirect},
routes, FromForm, State,
};
#[derive(FromForm)]
struct AuthForm {
email: String,
}
#[derive(FromForm)]
struct VerifyForm {
id_token: String,
}
#[get("/")]
fn index() -> RawHtml<&'static str> {
RawHtml(
r#"
<p>Enter your email address:</p>
<form method="post" action="/auth">
<input name="email" type="email">
<button type="submit">Login</button>
</form>
"#,
)
}
#[post("/auth", data = "<form>")]
async fn auth(form: Form<AuthForm>, client: &State<portier::Client>) -> Result<Redirect, Status> {
let url = client.start_auth(&form.email).await.map_err(|err| {
error!("Portier start_auth error: {}", err);
Status::InternalServerError
})?;
Ok(Redirect::to(Absolute::parse_owned(url.into()).unwrap()))
}
#[post("/verify", data = "<form>")]
async fn verify(
form: Form<VerifyForm>,
client: &State<portier::Client>,
) -> Result<RawHtml<String>, Status> {
let email = client.verify(&form.id_token).await.map_err(|err| {
error!("Portier verify error: {}", err);
Status::InternalServerError
})?;
Ok(RawHtml(format!("<p>Verified email address {}!</p>", email)))
}
#[launch]
fn rocket() -> _ {
let redirect_uri = "http://localhost:8000/verify".parse().unwrap();
rocket::build()
.mount("/", routes![index, auth, verify])
.manage(portier::Client::new(redirect_uri))
}