Skip to content

Commit 9f439fb

Browse files
Shield OIDC: Add builder
1 parent e88d542 commit 9f439fb

9 files changed

Lines changed: 91 additions & 85 deletions

File tree

Cargo.lock

Lines changed: 42 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ actix-web = "4.9.0"
1717
async-std = "1.13.0"
1818
async-trait = "0.1.83"
1919
axum = "0.7.9"
20+
bon = "3.3.2"
2021
chrono = "0.4.39"
2122
console_error_panic_hook = "0.1.2"
2223
futures = "0.3.31"
@@ -38,5 +39,5 @@ tower-sessions = "0.13.0"
3839
tracing = "0.1.41"
3940
tracing-subscriber = "0.3.19"
4041
uuid = "1.11.0"
41-
wasm-bindgen = "0.2.97"
42+
wasm-bindgen = "0.2.99"
4243
wasm-tracing = "1.0.1"

examples/leptos-actix/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ async fn main() -> std::io::Result<()> {
1212
use shield_examples_leptos_actix::app::*;
1313
use shield_leptos_actix::{provide_actix_integration, ShieldMiddleware};
1414
use shield_memory::{MemoryStorage, User};
15-
use shield_oidc::{KeycloakBuilder, OidcProvider};
15+
use shield_oidc::{Keycloak, OidcProvider};
1616
use tracing::{info, level_filters::LevelFilter};
1717

1818
// Initialize tracing
@@ -44,7 +44,7 @@ async fn main() -> std::io::Result<()> {
4444
let shield = Shield::new(
4545
shield_storage.clone(),
4646
vec![Arc::new(
47-
OidcProvider::new(shield_storage).with_subproviders([KeycloakBuilder::new(
47+
OidcProvider::new(shield_storage).with_subproviders([Keycloak::builder(
4848
"keycloak",
4949
"http://localhost:18080/realms/Shield",
5050
"client1",

examples/leptos-axum/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ async fn main() {
1111
use shield_examples_leptos_axum::app::*;
1212
use shield_leptos_axum::{auth_router, provide_axum_integration, ShieldLayer};
1313
use shield_memory::{MemoryStorage, User};
14-
use shield_oidc::{KeycloakBuilder, OidcProvider};
14+
use shield_oidc::{Keycloak, OidcProvider};
1515
use time::Duration;
1616
use tokio::net::TcpListener;
1717
use tower_sessions::{Expiry, MemoryStore, SessionManagerLayer};
@@ -39,7 +39,7 @@ async fn main() {
3939
let shield = Shield::new(
4040
storage.clone(),
4141
vec![Arc::new(
42-
OidcProvider::new(storage).with_subproviders([KeycloakBuilder::new(
42+
OidcProvider::new(storage).with_subproviders([Keycloak::builder(
4343
"keycloak",
4444
"http://localhost:18080/realms/Shield",
4545
"client1",

packages/providers/shield-oidc/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ version.workspace = true
1010

1111
[dependencies]
1212
async-trait.workspace = true
13+
bon.workspace = true
1314
chrono.workspace = true
1415
oauth2 = { version = "4.4.2", features = ["pkce-plain"] }
1516
openidconnect = "3.5.0"
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
mod google;
12
mod keycloak;
23

4+
pub use google::*;
35
pub use keycloak::*;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use crate::subprovider::{
2+
oidc_subprovider_builder::{SetClientId, SetDiscoveryUrl, SetId, SetName},
3+
OidcSubprovider, OidcSubproviderBuilder,
4+
};
5+
6+
pub struct Google {}
7+
8+
impl Google {
9+
pub fn builder(
10+
id: &str,
11+
client_id: &str,
12+
) -> OidcSubproviderBuilder<SetDiscoveryUrl<SetClientId<SetName<SetId>>>> {
13+
OidcSubprovider::builder()
14+
.id(id)
15+
.name("Google")
16+
.client_id(client_id)
17+
.discovery_url("https://accounts.google.com")
18+
}
19+
}
Lines changed: 16 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,20 @@
1-
use crate::subprovider::{OidcProviderPkceCodeChallenge, OidcProviderVisibility, OidcSubprovider};
1+
use crate::subprovider::{
2+
oidc_subprovider_builder::{SetClientId, SetDiscoveryUrl, SetId, SetName},
3+
OidcSubprovider, OidcSubproviderBuilder,
4+
};
25

3-
#[derive(Debug)]
4-
pub struct KeycloakBuilder {
5-
id: String,
6-
name: String,
7-
discovery_url: String,
8-
client_id: String,
9-
client_secret: Option<String>,
10-
redirect_url: Option<String>,
11-
}
12-
13-
impl KeycloakBuilder {
14-
pub fn new(id: &str, discovery_url: &str, client_id: &str) -> Self {
15-
Self {
16-
id: id.to_owned(),
17-
name: "Keycloak".to_owned(),
18-
discovery_url: discovery_url.to_owned(),
19-
client_id: client_id.to_owned(),
20-
client_secret: None,
21-
redirect_url: None,
22-
}
23-
}
24-
25-
pub fn name(mut self, name: &str) -> Self {
26-
self.name = name.to_owned();
27-
self
28-
}
29-
30-
pub fn client_secret(mut self, client_secret: &str) -> Self {
31-
self.client_secret = Some(client_secret.to_owned());
32-
self
33-
}
34-
35-
pub fn redirect_url(mut self, redirect_url: &str) -> Self {
36-
self.redirect_url = Some(redirect_url.to_owned());
37-
self
38-
}
6+
pub struct Keycloak {}
397

40-
pub fn build(self) -> OidcSubprovider {
41-
OidcSubprovider {
42-
id: self.id,
43-
name: self.name,
44-
slug: None,
45-
visibility: OidcProviderVisibility::Public,
46-
client_id: self.client_id,
47-
client_secret: self.client_secret,
48-
scopes: None,
49-
redirect_url: self.redirect_url,
50-
discovery_url: Some(self.discovery_url),
51-
issuer_url: None,
52-
authorization_url: None,
53-
authorization_url_params: None,
54-
token_url: None,
55-
token_url_params: None,
56-
introspection_url: None,
57-
introspection_url_params: None,
58-
revocation_url: None,
59-
revocation_url_params: None,
60-
user_info_url: None,
61-
json_web_key_set_url: None,
62-
json_web_key_set: None,
63-
pkce_code_challenge: OidcProviderPkceCodeChallenge::S256,
64-
}
8+
impl Keycloak {
9+
pub fn builder(
10+
id: &str,
11+
discovery_url: &str,
12+
client_id: &str,
13+
) -> OidcSubproviderBuilder<SetDiscoveryUrl<SetClientId<SetName<SetId>>>> {
14+
OidcSubprovider::builder()
15+
.id(id)
16+
.name("Keycloak")
17+
.client_id(client_id)
18+
.discovery_url(discovery_url)
6519
}
6620
}

packages/providers/shield-oidc/src/subprovider.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use bon::Builder;
12
use openidconnect::{
23
core::{
34
CoreClient, CoreJsonWebKey, CoreJsonWebKeyType, CoreJsonWebKeyUse, CoreJwsSigningAlgorithm,
@@ -23,11 +24,13 @@ pub enum OidcProviderPkceCodeChallenge {
2324
S256,
2425
}
2526

26-
#[derive(Clone, Debug)]
27+
#[derive(Builder, Clone, Debug)]
28+
#[builder(on(String, into), state_mod(vis = "pub(crate)"))]
2729
pub struct OidcSubprovider {
2830
pub id: String,
2931
pub name: String,
3032
pub slug: Option<String>,
33+
#[builder(default = OidcProviderVisibility::Public)]
3134
pub visibility: OidcProviderVisibility,
3235
pub client_id: String,
3336
pub client_secret: Option<String>,
@@ -53,6 +56,7 @@ pub struct OidcSubprovider {
5356
CoreJsonWebKey,
5457
>,
5558
>,
59+
#[builder(default = OidcProviderPkceCodeChallenge::S256)]
5660
pub pkce_code_challenge: OidcProviderPkceCodeChallenge,
5761
}
5862

0 commit comments

Comments
 (0)