52 lines
1.0 KiB
Rust
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)),
|
|
}
|
|
}
|