fb
WSO2 API Manager 5 minuten

Een handleiding voor JWT exchange met OAuth2 in 6 stappen

jenanathan-yogendran.jpg
Jenanathan Yogendran
Integration Consultant
yenlo blog 2020 05 25 jwt exchange 600x350
Scroll

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

yenlo_blog_2020-05-25_jwt-exchange-with-oauth2_figure-1

Login op de admin console van API Manager https://<am>:9443/carbon

Voeg een nieuwe Identity Provider toe via Identity Providers -> Add

Geef de waarde van <IDTokenIssuerID> in < WSO2-IS-KM-5.7.0 >/repository/conf/identity/identity.xml als de naam van de identiteitsprovider.

Let op: de IDTokenIssuerID waarde die in de Identity server geconfigureerd is zal gebruikt worden als ‘issuer value’ in de JWT token die door de Identity Server gegenereerd wordt. Hierdoor wordt de juiste identity provider config in de API Manager gekozen. Wanneer het een default waarde als IDTokenIssuerID krijgt voor het genereren van een Oauth token vanuit eenJWT token, is dat het OAuth2 Token endpoint URL. Als dat niet voldoende is, haal dan de volgende cofig buiten het commentaar en configureer expliciet de waarde <IDTokenIssuerID>${carbon.protocol}://${carbon.host}:${carbon.management.port}/oauth2/token</IDTokenIssuerID>

<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

yenlo_blog_2020-05-25_jwt-exchange-with-oauth2_figure-4

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 https://<is-km>:9443/carbon of WSO2-IS-KM

Voeg een nieuwe Service Provider toe via Service Providers -> Add

Geef een naam op (bijv. Web APP) en configureer vervolgens openid connect in Configuratie voor Inkomende Verificatie -> OAuth/OpenID Connect-configuratie
yenlo_blog_2020-05-25_jwt-exchange-with-oauth2_figure-5

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
yenlo_blog_2020-05-25_jwt-exchange-with-oauth2_figure-6
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

yenlo_blog_2020-05-25_jwt-exchange-with-oauth2_figure-7

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} 

yenlo_blog_2020-05-25_jwt-exchange-with-oauth2_figure-10

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.

yenlo_blog_2020-05-25_jwt-exchange-with-oauth2_figure-13

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.