diff --git a/examples/axum/src/main.rs b/examples/axum/src/main.rs index 57611ca..6010c59 100644 --- a/examples/axum/src/main.rs +++ b/examples/axum/src/main.rs @@ -43,7 +43,7 @@ async fn main() { ) .client_secret("xcpQsaGbRILTljPtX4npjmYMBjKrariJ") .redirect_url(format!( - "http://localhost:{}/api/auth/sign-in/callback/oidc/keycloak", + "http://localhost:{}/api/auth/oidc/sign-in-callback/keycloak", addr.port() )) .build()]), diff --git a/examples/dioxus-axum/src/main.rs b/examples/dioxus-axum/src/main.rs index 36d64d8..36dab48 100644 --- a/examples/dioxus-axum/src/main.rs +++ b/examples/dioxus-axum/src/main.rs @@ -32,8 +32,8 @@ async fn main() { use tracing::{Level, info}; // Initialize Dioxus - let addr = fullstack_address_or_localhost(); dioxus::logger::init(Level::DEBUG).unwrap(); + let addr = fullstack_address_or_localhost(); // Initialize sessions let session_store = MemoryStore::default(); @@ -53,8 +53,10 @@ async fn main() { ) .client_secret("xcpQsaGbRILTljPtX4npjmYMBjKrariJ") .redirect_url(format!( - "http://localhost:{}/api/auth/sign-in/callback/oidc/keycloak", - addr.port() + "http://localhost:{}/api/auth/oidc/sign-in-callback/keycloak", + dioxus::cli_config::devserver_raw_addr() + .map(|addr| addr.port()) + .unwrap_or_else(|| addr.port()) )) .build()]), )], diff --git a/examples/leptos-actix/Cargo.toml b/examples/leptos-actix/Cargo.toml index 380c546..0b74ea9 100644 --- a/examples/leptos-actix/Cargo.toml +++ b/examples/leptos-actix/Cargo.toml @@ -16,6 +16,8 @@ bin-default-features = false lib-features = ["hydrate"] lib-default-features = false +site-addr = "127.0.0.1:8080" + [lib] crate-type = ["cdylib", "rlib"] diff --git a/examples/leptos-axum/Cargo.toml b/examples/leptos-axum/Cargo.toml index 884d6ff..28781c3 100644 --- a/examples/leptos-axum/Cargo.toml +++ b/examples/leptos-axum/Cargo.toml @@ -16,6 +16,8 @@ bin-default-features = false lib-features = ["hydrate"] lib-default-features = false +site-addr = "127.0.0.1:8080" + [lib] crate-type = ["cdylib", "rlib"] diff --git a/examples/leptos-axum/src/main.rs b/examples/leptos-axum/src/main.rs index 043a0b8..0e8d973 100644 --- a/examples/leptos-axum/src/main.rs +++ b/examples/leptos-axum/src/main.rs @@ -51,7 +51,7 @@ async fn main() { ) .client_secret("xcpQsaGbRILTljPtX4npjmYMBjKrariJ") .redirect_url(format!( - "http://localhost:{}/api/auth/sign-in/callback/oidc/keycloak", + "http://localhost:{}/api/auth/oidc/sign-in-callback/keycloak", addr.port() )) .build()]), diff --git a/keycloak/Shield-realm.json b/keycloak/Shield-realm.json index 14f999a..b5a8f18 100644 --- a/keycloak/Shield-realm.json +++ b/keycloak/Shield-realm.json @@ -612,14 +612,14 @@ "description": "", "rootUrl": "", "adminUrl": "", - "baseUrl": "http://localhost:3000", + "baseUrl": "http://localhost:8080", "surrogateAuthRequired": false, "enabled": true, "alwaysDisplayInConsole": false, "clientAuthenticatorType": "client-secret", "secret": "xcpQsaGbRILTljPtX4npjmYMBjKrariJ", - "redirectUris": ["http://localhost:3000/api/auth/sign-in/callback/oidc/keycloak"], - "webOrigins": ["http://localhost:3000"], + "redirectUris": ["http://localhost:8080/api/auth/oidc/sign-in-callback/keycloak"], + "webOrigins": ["http://localhost:8080"], "notBefore": 0, "bearerOnly": false, "consentRequired": false, diff --git a/packages/core/shield/src/actions/sign_in_callback.rs b/packages/core/shield/src/actions/sign_in_callback.rs index 53b7559..03c4481 100644 --- a/packages/core/shield/src/actions/sign_in_callback.rs +++ b/packages/core/shield/src/actions/sign_in_callback.rs @@ -15,6 +15,6 @@ impl SignInCallbackAction { } pub fn condition(_provider: &P, _session: Session) -> Result { - Ok(false) + Ok(true) } } diff --git a/packages/core/shield/src/response.rs b/packages/core/shield/src/response.rs index 4b3b4b6..5ff75f2 100644 --- a/packages/core/shield/src/response.rs +++ b/packages/core/shield/src/response.rs @@ -1,4 +1,6 @@ -#[derive(Clone, Debug)] +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Deserialize, Serialize)] pub enum Response { // TODO: Remove temporary default variant. Default, diff --git a/packages/core/shield/src/shield.rs b/packages/core/shield/src/shield.rs index 501c63b..a1ef50e 100644 --- a/packages/core/shield/src/shield.rs +++ b/packages/core/shield/src/shield.rs @@ -4,9 +4,15 @@ use futures::future::try_join_all; use tracing::warn; use crate::{ - ActionError, ActionProviderForm, MethodError, ProviderError, Request, action::ActionForms, - error::ShieldError, method::ErasedMethod, options::ShieldOptions, session::Session, - storage::Storage, user::User, + action::{ActionForms, ActionProviderForm}, + error::{ActionError, MethodError, ProviderError, ShieldError}, + method::ErasedMethod, + options::ShieldOptions, + request::Request, + response::Response, + session::Session, + storage::Storage, + user::User, }; #[derive(Clone)] @@ -121,7 +127,7 @@ impl Shield { provider_id: Option<&str>, session: Session, request: Request, - ) -> Result<(), ShieldError> { + ) -> Result { let method = self.method_by_id(method_id) .ok_or(ShieldError::Method(MethodError::NotFound( @@ -142,9 +148,12 @@ impl Shield { provider_id.map(ToOwned::to_owned), )))?; - action.erased_call(provider, session, request).await?; + let response = action.erased_call(provider, session.clone(), request).await; - Ok(()) + // TODO: Should update always be called? + session.update().await?; + + response } } diff --git a/packages/core/shield/src/shield_dyn.rs b/packages/core/shield/src/shield_dyn.rs index 3459b51..5363e8a 100644 --- a/packages/core/shield/src/shield_dyn.rs +++ b/packages/core/shield/src/shield_dyn.rs @@ -3,8 +3,8 @@ use std::{any::Any, sync::Arc}; use async_trait::async_trait; use crate::{ - action::ActionForms, error::ShieldError, request::Request, session::Session, shield::Shield, - user::User, + action::ActionForms, error::ShieldError, request::Request, response::Response, + session::Session, shield::Shield, user::User, }; #[async_trait] @@ -24,7 +24,7 @@ pub trait DynShield: Send + Sync { provider_id: Option<&str>, session: Session, request: Request, - ) -> Result<(), ShieldError>; + ) -> Result; } #[async_trait] @@ -48,7 +48,7 @@ impl DynShield for Shield { provider_id: Option<&str>, session: Session, request: Request, - ) -> Result<(), ShieldError> { + ) -> Result { self.call(action_id, method_id, provider_id, session, request) .await } @@ -80,7 +80,7 @@ impl ShieldDyn { provider_id: Option<&str>, session: Session, request: Request, - ) -> Result<(), ShieldError> { + ) -> Result { self.0 .call(action_id, method_id, provider_id, session, request) .await diff --git a/packages/integrations/shield-axum/src/routes/action.rs b/packages/integrations/shield-axum/src/routes/action.rs index 88dc885..bba6d2d 100644 --- a/packages/integrations/shield-axum/src/routes/action.rs +++ b/packages/integrations/shield-axum/src/routes/action.rs @@ -23,8 +23,8 @@ pub async fn action( shield .call( - &method_id, &action_id, + &method_id, provider_id.as_deref(), session, Request { query, form_data }, diff --git a/packages/integrations/shield-dioxus/src/routes/action.rs b/packages/integrations/shield-dioxus/src/routes/action.rs index 01173a3..0912cef 100644 --- a/packages/integrations/shield-dioxus/src/routes/action.rs +++ b/packages/integrations/shield-dioxus/src/routes/action.rs @@ -1,5 +1,5 @@ use dioxus::prelude::*; -use shield::ActionForms; +use shield::{ActionForms, Response}; use crate::ErasedDioxusStyle; @@ -56,12 +56,12 @@ pub async fn call( action_id: String, method_id: String, provider_id: Option, -) -> Result<(), ServerFnError> { +) -> Result { #[cfg(feature = "server")] { use dioxus::prelude::{FromContext, extract}; use serde_json::Value; - use shield::Request; + use shield::{Request, Response}; use crate::integration::DioxusIntegrationDyn; @@ -69,7 +69,7 @@ pub async fn call( let shield = integration.extract_shield().await; let session = integration.extract_session().await; - shield + let response = shield .call( &action_id, &method_id, @@ -83,7 +83,7 @@ pub async fn call( ) .await?; - Ok(()) + Ok(response) } #[cfg(not(feature = "server"))] diff --git a/packages/integrations/shield-leptos/src/routes/action.rs b/packages/integrations/shield-leptos/src/routes/action.rs index 3ecdd28..c2f34d7 100644 --- a/packages/integrations/shield-leptos/src/routes/action.rs +++ b/packages/integrations/shield-leptos/src/routes/action.rs @@ -1,6 +1,6 @@ use leptos::prelude::*; use leptos_router::{hooks::use_params, params::Params}; -use shield::ActionForms; +use shield::{ActionForms, Response}; use crate::ErasedLeptosStyle; @@ -62,7 +62,7 @@ pub async fn call( let shield = integration.extract_shield().await; let session = integration.extract_session().await; - shield + let response = shield .call( &action_id, &method_id, @@ -76,5 +76,12 @@ pub async fn call( ) .await?; + match response { + Response::Default => todo!("default reponse"), + Response::Redirect(to) => { + integration.redirect(&to); + } + } + Ok(()) } diff --git a/packages/styles/shield-bootstrap/src/dioxus/form.rs b/packages/styles/shield-bootstrap/src/dioxus/form.rs index 0020108..b0dae1b 100644 --- a/packages/styles/shield-bootstrap/src/dioxus/form.rs +++ b/packages/styles/shield-bootstrap/src/dioxus/form.rs @@ -1,5 +1,5 @@ use dioxus::{logger::tracing::info, prelude::*}; -use shield::ActionProviderForm; +use shield::{ActionProviderForm, Response}; use shield_dioxus::call; use crate::dioxus::input::FormInput; @@ -12,6 +12,8 @@ pub struct FormProps { #[component] pub fn Form(props: FormProps) -> Element { + let navigator = navigator(); + rsx! { form { onsubmit: { @@ -27,6 +29,16 @@ pub fn Form(props: FormProps) -> Element { let result = call(action_id, method_id, provider_id).await; info!("{:?}", result); + + // TODO: Handle error. + if let Ok(response) = result { + match response { + Response::Default => todo!("default response"), + Response::Redirect(to) => { + navigator.push(to); + }, + } + } } } },