In dit artikel gaan we bespreken hoe we de WSO2 Identity Server kunnen integreren met een Spring boot applicatie door gebruik te maken van de open veiligheidsstandaard SAML2.
Door een SAML2-integratie te gebruiken in de Spring boot applicatie kunnen gebruikers met WSO2 IS voor die applicatie authenticeren. Onze Spring boot applicatie zal optreden als een SAML2-serviceprovider (SP) en de WSO2 IS wordt dan een SAML2-identityprovider (IdP). De gebruiker zou dan een zogenaamde ‘principle‘ zijn en dit artikel gebruikt de SAML2 flow die geïnitieerd wordt door de service provider.
Het onderstaande diagram laat de SAML2 flow zien.
Dit artikel is verdeeld in de volgende onderwerpen:
- Het creëren van een serviceprovider in WSO2 IS
- Implementatie van de Spring boot applicatie
- Het testen van de use case
Het creëren van een serviceprovider in WSO2 IS
- Start de WSO2 IS op, log in op de management console en navigeer naar de Identity > Service Providers > Add.[1]
- Voer de naam van de service provider in als “SpringbootSAML2SP” en klik op de “Register”-button.
- In het scherm met “Basic Information” van de service provider zullen we een Application Certificate moet opgeven. Dit certificaat wordt gebruikt wanneer we de SAML2 requests valideren die door onze Spring boot applicatie verstuurd worden
Let op: het creëren van de Keystore en het certificaat zijn gerelateerd aan de Spring boot applicatie, maar in dit onderdeel gaan we beide creëren, omdat we ze in het certificaat moeten invoegen op het moment dat we de serviceprovider in WSO2 IS configureren.
A. Creëer een nieuwe keystore
keytool -genkey -keyalg RSA -alias saml2cert -keystore keystore.jks -storepass password -validity 365 -keysize 2048
B. Exporteer het certificaat
keytool -export -keystore keystore.jks -alias saml2cert -file certificate.cer
C. Gebruik het volgende commando om het certificaat in de terminal te tonen. Kopieer vervolgens de inhoud ervan en plak het in het certificaatgedeelte van de applicatie van de serviceprovider in de WSO2 IS admin console.
keytool -printcert -rfc -file certificate.cer
D. Vink het vakje “SaaS Application” aan en scroll verder naar de “Inbound Authentication Configuration” -> SAML2 Web SSO Configuration. Klik op de link “Configure”.
E. Configureer de serviceprovider informatie zoals hieronder en klik op de knop “Register”.
issuer | http://localhost:8080/saml2/service-provider-metadata/wso2 | Unieke identificatie van de service provider. Dit is ook de issuer value die in de SAML Authentication Request gespecificeerd wordt, zoals uitgegeven door de service provider. |
Assertion Consumer URLs | http://localhost:8080/login/saml2/sso/wso2 | Dit is de URL waar de browser naartoe verwezen moet worden nadat de authentication geslaagd is. |
Laat de overige configuratie op de standaardwaarden staan en update de serviceprovider.
Implementatie van de Spring boot applicatie
Om een Spring boot project te creëren, gebruik ik de Spring Initializer web tool, daarna importeer ik het project in de IDE en doe ik de rest van de implementatie.
Volledig projectvoorbeeld in Bitbucket: https://bitbucket.org/yenlo/yenlo_springboot-wso2is-sample
Stap 1
Open de pagina https://start.spring.io/ en vul de artifacts van het project als volgt in:
Group: com.wso2is.saml2.sample
Artifact: springboot-wso2is-sample
Voeg de afhankelijkheden van Thymeleaf, Spring Security, Spring Boot DevTools en Lombok toe.
Klik op “Generate” om het project te downloaden en importeer het dan in je IDE als een Maven project.
Stap 2
Voeg de volgende SAML2 afhankelijkheid toe aan het project.
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-saml2-service-provider</artifactId>
</dependency>
Stap 3
Nadat we al onze sample code geïmplementeerd hebben ziet onze projectstructuur er als volgt uit:
Stap 4
Wanneer de gebruiker probeert in te loggen op de Spring boot applicatie, zal hij eerst via SAML2 flow moeten authenticeren. De WebConfiguration class zal het inloggen onderscheppen en de SAML2 request initiëren zoals hieronder te zien is:
Stap 5
De onderstaande controller neemt de HTTP aanvragen voor zijn rekening. Wanneer de gebruiker het HTTP GET via http://localhost:8080/login uitvoert, zal het de autowired relaying parties configuratie gebruiken om de vereiste certificaten, private keys, SSO URL, enz. te krijgen.
Stap 6
Configureer “wso2” als relying party door het bestand ‘application.properties’ te gebruiken.
A. Genereer een private key. Omdat we al een KeyStore en een certificaat hebben, gebruiken we de volgende commando’s om een private key te genereren.
keytool -importkeystore -srckeystore keystore.jks -srcstorepass password -srckeypass password -srcalias saml2cert -destalias saml2cert -destkeystore keystore.p12 -deststoretype PKCS12 -deststorepass password -destkeypass password
openssl pkcs12 -in keystore.p12 -nodes -nocerts -out private_key.pem
B. Genereer het certificaat vanuit wso2carbon.jks.
keytool -export -keystore wso2carbon.jks -alias wso2carbon -file wso2is-certificate.cer
Stap 7
Creëer een voorbeeld HTML-bestand om de SAML response te tonen.
Creëer een index.html pagina binnen in de map resources/templates/. Op het moment dat de IdP de aanvraag doorstuurt, zal de ACS URL controller deze sample index pagina aanroepen.
Het testen van de use case
Stap 1
Bouw en run de de Spring boot applicatie.
Stap 2
Open de webbrowser en voer de URL in als http://localhost:8080/login
Dit zou doorgestuurd moeten worden naar de WSO2 IS inlogpagina. Voer de gebruikersnaam en het wachtwoord in (admin/admin) en klik dan op de knop “Continue”.
Stap 3
Je zult doorgestuurd worden naar de Spring boot applicatie en de indexpagina zal getoond worden met de informatie van de SAML2 response.
Conclusie
In deze blog hebben we laten zien hoe je een Spring boot applicatie de authenticatie van gebruikers naar de WSO2 Identity Server kan laten delegeren. Bij het leggen van de verbinding tussen een Spring boot applicatie en een Identity Provider zullen er een aantal certificaten en keys gegenereerd moeten worden en zullen er in Spring-boot applicatie en in de WSO2 Identity Server dingen geconfigureerd moeten worden.
Door met SAML2 te werken hebben we laten zien hoe we de WSO2 Identity Server als een eenvoudige Single Sign-On engine voor onze Spring-boot applicatie kunnen gebruiken.