From 10552e4831a65ac826a95b583bc5a21400736085 Mon Sep 17 00:00:00 2001 From: Adam Wolfman Date: Mon, 24 Apr 2023 16:19:42 -0600 Subject: [PATCH] Update java sso app with new UI/UX --- java-sso-example/README.md | 4 +- .../java/com/workos/java/examples/SsoApp.java | 29 +- java-sso-example/src/main/jte/home.jte | 45 +- java-sso-example/src/main/jte/profile.jte | 21 +- .../src/resources/images/google-button.png | Bin 0 -> 5816 bytes .../src/resources/images/microsoft-button.png | Bin 0 -> 3313 bytes .../src/resources/images/saml-button.png | Bin 0 -> 4984 bytes java-sso-example/src/resources/main.css | 436 +++++++++++------- 8 files changed, 344 insertions(+), 191 deletions(-) create mode 100644 java-sso-example/src/resources/images/google-button.png create mode 100644 java-sso-example/src/resources/images/microsoft-button.png create mode 100644 java-sso-example/src/resources/images/saml-button.png diff --git a/java-sso-example/README.md b/java-sso-example/README.md index c8410b6..186aef9 100644 --- a/java-sso-example/README.md +++ b/java-sso-example/README.md @@ -51,11 +51,11 @@ The .env file is listed in this repo's .gitignore file, so your sensitive inform ## Set up SSO with WorkOS 7. Create an [Organization](https://dashboard.workos.com/organizations) and an [SSO Connection](https://workos.com/docs/sso/guide/introduction) in the Organization in your WorkOS Dashboard. -8. Copy the Connection ID from the new connection that you just set up and add it to the same .env file that you created in step 6. The .env file should now look like this: +8. Copy the Organization ID from the organization that you just set up and add it to the same .env file that you created in step 6. The .env file should now look like this: ```bash WORKOS_API_KEY=your_api_key_here WORKOS_CLIENT_ID=your_project_id_here -WORKOS_CONNECTION_ID=your_connection_id_here +WORKOS_ORGANIZATION_ID=your_organization_id_here ``` 10. Add http://localhost:7001/callback as the default Redirect URI in the Configuration section of the WorkOS Dashboard: diff --git a/java-sso-example/src/main/java/com/workos/java/examples/SsoApp.java b/java-sso-example/src/main/java/com/workos/java/examples/SsoApp.java index d954c0e..0ee8052 100644 --- a/java-sso-example/src/main/java/com/workos/java/examples/SsoApp.java +++ b/java-sso-example/src/main/java/com/workos/java/examples/SsoApp.java @@ -25,22 +25,33 @@ public SsoApp() { clientId = env.get("WORKOS_CLIENT_ID"); app.get("/", this::isLoggedIn); - app.get("/login", this::login); + app.post("/login", this::login); app.get("/callback", this::callback); app.get("logout", this::logout); } public void login(Context ctx) { Dotenv env = Dotenv.configure().directory("../.env").load(); - String connectionId = env.get("WORKOS_CONNECTION_ID"); - String url = - workos - .sso - .getAuthorizationUrl(clientId, "http://localhost:7001/callback") - .connection(connectionId) - .build(); + String organizationId = env.get("WORKOS_ORGANIZATION_ID"); + String loginType = ctx.formParam("login_method"); - ctx.redirect(url); + if (loginType.equals("saml")) { + String url = + workos + .sso + .getAuthorizationUrl(clientId, "http://localhost:7001/callback") + .organization(organizationId) + .build(); + ctx.redirect(url); + } else { + String url = + workos + .sso + .getAuthorizationUrl(clientId, "http://localhost:7001/callback") + .provider(loginType) + .build(); + ctx.redirect(url); + } } public void callback(Context ctx) { diff --git a/java-sso-example/src/main/jte/home.jte b/java-sso-example/src/main/jte/home.jte index 971ac24..261b32b 100644 --- a/java-sso-example/src/main/jte/home.jte +++ b/java-sso-example/src/main/jte/home.jte @@ -1,12 +1,43 @@ - -
-
- workos logo -
+ +
+
+
+ workos logo +
-

Java SSO Example App

- +
+ +
+
+
+
+
+
+
+ Log in with SSO +
+
+ + + +
+
+
+
diff --git a/java-sso-example/src/main/jte/profile.jte b/java-sso-example/src/main/jte/profile.jte index 11566ad..d1812ac 100644 --- a/java-sso-example/src/main/jte/profile.jte +++ b/java-sso-example/src/main/jte/profile.jte @@ -6,10 +6,11 @@
- workos logo + workos logo
+
-
+
@@ -19,22 +20,6 @@
-
-
-

Your app,

-

Enterprise Ready

-
-
-

Start selling to enterprise customers with just a few lines of code.

-

Implement features like single sign-on in minutes instead of months.

-
- -
diff --git a/java-sso-example/src/resources/images/google-button.png b/java-sso-example/src/resources/images/google-button.png new file mode 100644 index 0000000000000000000000000000000000000000..0332ec00f44514309e8fb0b5ce9fdaf049baa804 GIT binary patch literal 5816 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 literal 0 HcmV?d00001 diff --git a/java-sso-example/src/resources/images/microsoft-button.png b/java-sso-example/src/resources/images/microsoft-button.png new file mode 100644 index 0000000000000000000000000000000000000000..2c725dc373feaeb92fedee284bf7c8ad35beceff GIT binary patch literal 3313 zcma)8c{CJowEo#@kR|()Y|(-&At^fC?$7Y769l=tVw`H z5`{~3hVqC7p*g-$mFD&gh=}4KJ*<{_tZxAFIV+obS7bB;f`jvX7SyaWe3Su-jh@fB zf_K(<6>Sw`_CRS}aH_C2G>E*mcJSk%nV3a996$}SV9v9NCobo?fLrj$JIdpN@rKaO z-WCisCv=uph;^Cp$(gPTfDIZ{AlkQ5?U1U%6Ho)M(d(Dky5~+J8jZxwflwlt6=5SX zQYFAa&vnxt4$#8`Dos8KcML-D?SpBP~N(aV^lcu=Ac;1C#2#BQu=~r|w zQL8rrd$VV7N$U1bAP1)|a-FuloC;%EC#Oq|X`uuDaTWh=JWt|{3Egp{a()j?8e|Y_XkJBpyly+6gKBY4?Y3aNtwE@da#c%+3qXe{!qRL~>tcb)sJs$x6!< zWrq@JU<2m>;M*JOI95_iATBS?Ejtn2$bY-?j$JoAMO1}1XO5d+Q_})ggF*6y-O|z+ zjaN5SrC*zCu{D@LfX6d?Ha8~ebF3J?1?|P4ln&J|X6G99+!46Iz{t2J=8)SWvk;?t za%0YOHU_gi?e`4LA?kski#@HirYR#Vo4LKHpjjto1ByE-&4U-dwe z^VO!sOT3YYemANCo~SL{n=;R~5+=7Pn0iE?6u<;rp=!j2SHjy~@YH!d;&;ZBdE6+uGf-(U)aR-!qKMY?*t3#f}V zT@r1eqFYkl9JgX0sP89C_6W(nI(*fvE1UeR+L&g9+E2ZqNRaQp7IWqUT}sd6(b?$!zx&9;q$SzJDjDnVwT(++UnM z0x5}BerKiUp5t#MZSta+UEVK4tUr@Wi%=kyKl&}>iSrZ6W9b#&M*8W9i#loF(uQ4s zpIsrYMEngn#}vgB(G7LD!t2T#%v;D)&nuk{`#|?SExpH7=7$`Ay7OC>x1MGe*LJUk za3+3bOHociq@YuXC8lORW@@9T5=PTfGnP_YMCgaRW*?0fis?tVN=J(Y%$kZ7%Lm{A z@OYy^W4ruTyQA=ZN2cni$h$dF(0o(J`Y*h(!dzeE9&K7^j(H*^OI2v+fND4=@b`OVLQFNmY%xlsT25%Wh5t zO|(upta-0-t&t|keqLC0tR!|v*^UrFTwG*>)R*zp^fKrMdt~R8xuPp=MU-SU&f2C zzi?hq2;^3E!g*eBz{&r5H062+>F`8uvY@k|Yq9lef3jWsC3hpgJ6@fzRAb#NV#vYI)N$z9j zZbtm(nddT@#htDXMX2gAMCaQ_lNrl1hzE)G;S03!dHbJ z?}7*^OML5%!?oXc@-v$VFIqpeip;3A zilWER>FBeE*$21x2}kk&+U8JOT$=`T_Ea5IOH?h-_?~^FaitNYO{aZ-R)H>-uIY^Q zIaN;0bM#D>g5F7RrAUt97A+5)TjDn3i(fa~o^+}6_IJj) zxWU~VS2OV#dO-fP>H;68br7C5!z$FaDzXe{*=0voRyrF4`+IkS|jm8 zrv6I3p_7C}64N4T+5Ibj(u=Q@MbSN2=M77`@LVj zxj`;Fas4&@U;AkkkP2(oeRa6Wtz5j*&^Y$-t z@@jLfM4-8Ai%#f{$MAaibUdE}e`DJ+dK#}AVAz!%AN)S}?5+-(ht5@kLxz?P%Y#ytNisI;?o!KVvRfh{CC&50~pp} zQ#L{Iffa|X6Gwl}?z8*}t2wTE)b2j}&%WJ$@UtZgnVJ4Y_Hpvb_ZM@+x_!E%qIX4O zyMjgJ0yjiJeYygt4g8+5T zy=njGGDI;i63Q3x@{O7}Z;YGOQ$wMx`R#U@(OWa7YD%96>X1APLLGf=Xn<)Gvrs?R zLG1wHV%4g|@PyNKvPud?*;C2VGDZvkH|XQEglAp7S?y4*f5oq`7N5=Dm|(k$XzPmZ ze8l8;k0C25)i#9(YZ)xse^|zHZ(vCVhU<)G3O5_TaZe)a|5*0F@Z_H?5RV*T(-kGi z3TEaKe@f|H_kAg=ZayLFu*zkUkD0r_!I6^7q=K!5MU$_`vXoz2ET VMKd%Tv`=3K=;;_}muuRG{|DaqHw*v( literal 0 HcmV?d00001 diff --git a/java-sso-example/src/resources/images/saml-button.png b/java-sso-example/src/resources/images/saml-button.png new file mode 100644 index 0000000000000000000000000000000000000000..e03328f1b02c0b8eb38850f9e3f8152fc99794b8 GIT binary patch literal 4984 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 :first-child { + display: none; +}