diff options
author | Kjetil Orbekk <kj@orbekk.com> | 2022-10-14 19:07:14 -0400 |
---|---|---|
committer | Kjetil Orbekk <kj@orbekk.com> | 2022-10-14 19:07:14 -0400 |
commit | 58f91c62065d9a7e37c953503100b87b506297e7 (patch) | |
tree | 9e43fb45702d06366af015151f8ea4613e46e08a | |
parent | 1e0ceb4b7c714430ff42a1c98d416246f035d75f (diff) |
Automatically log in again when token refresh fails
-rw-r--r-- | server/src/error.rs | 14 | ||||
-rw-r--r-- | server/src/main.rs | 7 | ||||
-rw-r--r-- | webapp/src/components/app_context_provider.rs | 6 |
3 files changed, 22 insertions, 5 deletions
diff --git a/server/src/error.rs b/server/src/error.rs index aef2687..9d82a54 100644 --- a/server/src/error.rs +++ b/server/src/error.rs @@ -1,4 +1,7 @@ -use axum::{http::{StatusCode, self}, response::IntoResponse}; +use axum::{ + http::{self, StatusCode}, + response::IntoResponse, +}; use openidconnect::{core::CoreErrorResponseType, ClaimsVerificationError, StandardErrorResponse}; use tracing::error; @@ -47,13 +50,18 @@ pub enum BridgeError { impl BridgeError { pub fn as_rejection(&self) -> (http::StatusCode, String) { - (StatusCode::INTERNAL_SERVER_ERROR, format!("Error: {self}")) + match self { + BridgeError::OpenidRequestTokenError(_) => { + (StatusCode::UNAUTHORIZED, format!("Error fetching token")) + } + _ => (StatusCode::INTERNAL_SERVER_ERROR, format!("Error: {self}")), + } } } impl IntoResponse for BridgeError { fn into_response(self) -> axum::response::Response { error!("Error occurred: {self:?}"); - self.as_rejection().into_response() + self.as_rejection().into_response() } } diff --git a/server/src/main.rs b/server/src/main.rs index b961c17..6896818 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -4,7 +4,7 @@ use auth::AuthenticatedSession; use axum::{ extract::{Extension, Query}, response::Redirect, - routing::get, + routing::{get, post}, Json, Router, }; use protocol::{Table, UserInfo}; @@ -58,6 +58,7 @@ async fn main() { let app = Router::new() .route("/api/user/info", get(user_info)) + .route("/api/table", post(create_table)) // .route("/api/user/table", get(user_table)) .route("/api/login", get(login)) .route(auth::LOGIN_CALLBACK, get(login_callback)) @@ -71,6 +72,10 @@ async fn main() { .unwrap(); } +async fn create_table(session: AuthenticatedSession) -> Result<(), BridgeError> { + todo!() +} + async fn user_info( session: Option<AuthenticatedSession>, extension: ContextExtension, diff --git a/webapp/src/components/app_context_provider.rs b/webapp/src/components/app_context_provider.rs index 50e4e1a..e3fe82e 100644 --- a/webapp/src/components/app_context_provider.rs +++ b/webapp/src/components/app_context_provider.rs @@ -20,7 +20,11 @@ pub struct Props { } async fn initialize_context() -> Result<AppContext, anyhow::Error> { - let user = Request::get("/api/user/info").send().await?.json().await?; + let response = Request::get("/api/user/info").send().await?; + if response.status() == 401 { + web_sys::window().unwrap().location().assign("/api/login").unwrap(); + }; + let user = response.json().await?; Ok(AppContext { user: user, error: None, |