52 lines
1.0 KiB
Rust

use std::time::{
Duration,
Instant,
};
use askama::Template;
use axum::response::{
IntoResponse,
};
use axum::extract::State;
use openidconnect::{
reqwest::async_http_client,
TokenIntrospectionResponse,
};
use crate::util::askama::HtmlTemplate;
use crate::AppState;
use crate::error::openid::AuthError;
use crate::util::openid::AccessToken;
#[derive(Template)]
#[template(path = "user_home.html")]
struct UserHomeTemplate {
active: bool,
username: String,
duration: Duration,
}
pub async fn home(
State(app_state): State<AppState>,
AccessToken(token): AccessToken,
) -> Result<impl IntoResponse, AuthError> {
let now = Instant::now();
let response = app_state.oidc_client
.introspect(&token)?
.request_async(async_http_client)
.await
.map_err(|e| e.to_string())?;
match response.active() {
true => {
let username = response.username().unwrap().to_string();
Ok(HtmlTemplate(UserHomeTemplate {
active: true,
username,
duration: now.elapsed(),
}))
},
false => Err(AuthError::TokenNotActive(token)),
}
}