summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2022-10-14 19:07:14 -0400
committerKjetil Orbekk <kj@orbekk.com>2022-10-14 19:07:14 -0400
commit58f91c62065d9a7e37c953503100b87b506297e7 (patch)
tree9e43fb45702d06366af015151f8ea4613e46e08a
parent1e0ceb4b7c714430ff42a1c98d416246f035d75f (diff)
Automatically log in again when token refresh fails
-rw-r--r--server/src/error.rs14
-rw-r--r--server/src/main.rs7
-rw-r--r--webapp/src/components/app_context_provider.rs6
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,