Bij een server-side webapplicatie die gebruik maakt van de WSO2 Identity Server voor authenticatie, wordt deze authenticatie uitgevoerd via OpenID connect. Wanneer een eindgebruiker geauthenticeerd is, zal de webapplicatie voor de gebruiker toegang moeten krijgen tot bepaalde API’s die in de API-Manager gepubliceerd zijn. API’s in de API-Manager zijn beveiligd en om toegang te krijgen heeft de webapplicatie een OAuth2 token nodig. Deze wordt verkregen door de JWT token in te wisselen die bij het inloggen ontvangen werd.
WSO2 API Manager ondersteunt verschillende OAuth2 grant types zoals wachtwoorden, client inloggegevens, code, JWT, etc. Omdat de webapplicatie geconfigureerd is om OpenID connect te gebruiken voor het inloggen, zal het een signed JWT token van de WSO2 Identity Server krijgen. Daardoor kan het grant type JWT token gebruikt worden om de OAuth token te genereren door uitwisseling van de JWT token die bij het inloggen ontvangen is.
Om het voorbeeld in deze WSO2 Tutorial te runnen, zul je de volgende dingen al geïnstalleerd moeten hebben: WSO2 API Manager 2.6.0, WSO2 Identity Server als Key Manager 5.7.0, waarbij de blog Configuring Identity Server as Key Manager guide kan helpen.
Stap 1 – Configureer WSO2-IS-KM-5.7.0 als Trusted IDP in de API Manager
Login op de admin console van API Manager
<IDTokenIssuerID>${carbon.protocol}://${carbon.host}:${carbon.management.port}/oauth2/token</IDTokenIssuerID>
Exporteer het certificaat van WSO2-IS-KM-5.7.0 en importeer het naar de IDP-configuratie.
Exporteren: Navigeer naar < WSO2-IS-KM-5.7.0 >/repository/resources/security en voer het onderstaande commando uit om het certificaat te exporteren als wso2.crt bestand.
keytool -export -alias wso2carbon -file wso2.crt -keystore wso2carbon.jks -storepass wso2carbon
Importeren: Upload nu het certificaat naar de trusted IDP config
Kies IDP certificate type -> Upload IDP certificate
Sla de configuratie op
Stap 2 – Configureer de Service Provider in WSO2-IS-KM als log in voor de web app
Log in op de admin console van de Identity Server via
Call Back URL: De web app URL waar de OpenID connect respons naartoe verzonden moet worden door IS.
Audience Restriction inschakelen: Dit is de Token endpoint Alias die gegeven wordt bij het aanmaken van de Trusted IDP in de API Manager.
Let op: Audience Restriction URL’s zullen deel uitmaken van de JWT token die door de IS gegenereerd wordt.
Stap 3 – API publiceren en abonneren
Creëer een eenvoudige API voor het testen in Publisher
Ga naar de Store en Creëer een nieuw applicatie
Let op: zorg ervoor dat JWT grant type geselecteerd staat
Abonneer de API nu op de gecreëerde applicatie
Stap 4 – Inloggen als gebruiker en ID-token (JWT) ontvangen
Let op: Het inloggen bij OpenID connect kan met verschillende grant types. In dit geval gaan we er vanuit dat de web app vertrouwd is en toegang heeft tot de inloggegevens en daarom een password grant gebruikt om in te loggen en OpenID connect tokens te ontvangen.
Aanvraag: Haal Consumer Key en Consumer secret van de Service Provider “WebAPP” die in stap 2 gecreëerd is. Gebruikersnaam en wachtwoord zouden de inloggegevens van een gebruiker moeten zijn die inlogt op de Webapplicatie (beschikbaar in de IS userstore).
curl -k -u <consumer-kery>:<consumer-secret> -d "grant_type=password&username=<username>&password=<password>&scope=openid" https://<is-km>:9443/oauth2/token
Respons: De respons bevat een JWT token (id_token) die gebruikt wordt om in de volgende stap een OAuth token te genereren.
{"access_token":"a5a335e6-a025-322d-bb9a-f9497ab47ffc","refresh_token":"99e5a365-64eb-32b2-b084-4939b9e21f47","scope":"openid","id_token":"<xxxxxxx>","expires_in":2320}
Stap 5 – Genereer OAuth Token met JWT token (id_token return) d.m.v. JWT grant
De gebruiker is nu ingelogd op de web app en de web app heeft een JWT ontvangen. Als OpenID connect respons zal de web app in naam van de gebruiker toegang moeten krijgen tot de API, die in de API Manager gepubliceerd is.
Eerst zal de web app een geldige OAuth token moet krijgen door de ontvangen JWT token in te wissen via het JWT grant type door het token endpoint in APIM aan te roepen.
Aanvraag: Haal de Consumer key en Consumer secret uit de app die in stap 3 in de API store gecreëerd is. Gebruik het JWT grant type om de token aan te vragen. Gebruik de id_token die in de vorige stap ontvangen is ter bevestiging.
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' -u <consumer-key>:<consumer-secret> -k -d 'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=<id_token>' https://<apim>:8243/token
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' -u <consumer-key>:<consumer-secret> -k -d 'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=<id_token>' https://<apim>:8243/token
Respons: Bevat een OAuth access token dat gebruikt kan worden voor een API die op een bepaalde applicatie geabonneerd is.
{"access_token":"12c13079-9819-3676-ad64-6e46176a6607","refresh_token":"84a86921-b816-3a3a-94bf-6ea7c99cb376","scope":"default","token_type":"Bearer","expires_in":1886}
Stap 6 – De API aanroepen
Gebruik de access token die in stap 5 ontvangen is voor toegang tot de gepubliceerde API.
curl -k -X GET "https://<apim>:8243/test/1/" -H "accept: application/json" -H "Authorization: Bearer 12c13079-9819-3676-ad64-6e46176a6607"
Troubleshooting
Fout bij het aanroepen van het token endpoint met JWT grant type.
{"error_description":"None of the audience values matched the token. Endpoint Alias https://xxxxxx:9443/oauth2/token","error":"invalid_grant"}
Deze error ontstaat doordat de URL in de Audience Restriction van de Service provider zit, waardoor er een JWT token gegenereerd wordt die niet overeenkomt met de Token Endpoint Alias, zoals opgegeven in de Trusted IDP configuratie in de API Manager. Om dit verhelpen, update je de configuraties met de juiste URL.
Als je vragen hebt over de stappen die in deze blog beschreven staan, laat dan hieronder een commentaar achter. Neem contact met ons op voor meer informatie over onze support services.