fb
WSO2 API Manager 5 Minuten

Eine Anleitung in 6 Schritten für den JWT-Austausch mit OAuth2

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

Eine serverbasierende Webanwendung verwendet WSO2 Identity Server zur Authentifizierung. Die Authentisierung wird mit OpenID connect durchgeführt. Sobald ein Endbenutzer authentifiziert ist, muss die Webanwendung im Namen des angemeldeten Benutzers auf einige im API-Manager veröffentlichte APIs zugreifen. APIs im API Manager sind geschützt und um auf die APIs zugreifen zu können, muss die Webanwendung ein OAuth2-Token für das JWT-Token erhalten, das sie im Anmeldeschritt erhalten hat.

WSO2 API Manager unterstützt verschiedene OAuth2-Berechtigungstypen wie Passwort, Client-Anmeldedaten, Code, JWT usw. Da die Web-App so konfiguriert ist, dass sie OpenID connect für die Anmeldung nutzt, wird sie das signierte JWT-Token vom WSO2 Identity Server erhalten. Deshalb kann der JWT-Token-Grant-Typ verwendet werden, um das OAuth-Token zu generieren, indem das im Anmeldefluss empfangene JWT-Token ausgetauscht wird.

Um das Beispiel in diesem WSO2-Tutorial auszuführen, müssen die folgenden Voraussetzungen gegeben sein: WSO2 API Manager 2.6.0, WSO2 Identity Server als Schlüsselmanager 5.7.0, Anleitung zum Konfigurieren von Identity Server als Key Manager.

Schritt 1 – Konfigurieren von WSO2-IS-KM-5.7.0 als Trusted IDP in API Manager

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

Melden Sie sich bei der Admin-Konsole von API Manager an https://<am>:9443/carbon

Fügen Sie einen neuen Identitätsanbieter aus dem linken Bereich hinzu Identitätsanbieter -> Hinzufügen

Geben Sie den Wert von <IDTokenIssuerID> in an
< WSO2-IS-KM-5.7.0 >/repository/conf/identity/identity.xml als Name des Identitätsanbieters ein.

Hinweis: Der im Identity Server konfigurierte Wert IDTokenIssuerID wird als Issuer-Wert im vom Identity Server generierten JWT-Token verwendet. Damit wird die richtige Identity-Provider-Konfiguration im API-Manager abgeholt, wenn er ein JWT-Token für die Oauth-Token-Generierung empfängt Standardwert für IDTokenIssuerID ist die OAuth2-Token-Endpunkt-URL. Wenn das nicht ausreicht, entfernen Sie das Kommentarzeichen in der folgenden Konfiguration und konfigurieren Sie explizit den Wert

<IDTokenIssuerID>${carbon.protocol}://${carbon.host}:${carbon.management.port}/oauth2/token</IDTokenIssuerID>

Exportieren Sie das Zertifikat von WSO2-IS-KM-5.7.0 und importieren Sie es in die IDP-Konfiguration

Exportieren: Navigieren Sie zu < WSO2-IS-KM-5.7.0 >/repository/resources/security und führen Sie folgenden Befehl aus, der das Zertifikat in die Datei wso2.crt exportiert

keytool -export -alias wso2carbon -file wso2.crt -keystore wso2carbon.jks -storepass wso2carbon

Importieren: Laden Sie nun das Zertifikat in die Trusted IDP Config hoch

IDP-Zertifikatstyp wählen -> IDP-Zertifikat hochladen

Speichern Sie die Konfiguration

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

Schritt 2 – Konfigurieren Sie den Service Provider in WSO2-IS-KM für die Anmeldung der Web-App

Melden Sie sich an der Verwaltungskonsole des Identity Servers an https://<is-km>:9443/carbon of WSO2-IS-KM

Neuen Dienstanbieter aus dem linken Bereich hinzufügen Dienstanbieter -> Hinzufügen

Geben Sie einen Namen (z. B. Web APP) und konfigurieren Sie dann openid connect in Inbound Authentication Configuration -> OAuth/OpenID Connect Configuration

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

    Call Back-URL: Web-App-URL, an die die Open-Id Connect-Antwort vom IS gesendet werden soll.

    Audience Restriction aktivieren: Token-Endpunkt-Alias, der beim Erstellen des vertrauenswürdigen IDP im API-Manager angegeben wurde.

    Hinweis: Audience Restriction URLs sind Teil des vom IS generierten JWT-Tokens.

    Schritt 3 – API veröffentlichen und abonnieren

    Erstellen Sie eine einfache API zum Testen im Publisher

    Gehen Sie zum Store und erstellen Sie eine neue App
    yenlo_blog_2020-05-25_jwt-exchange-with-oauth2_figure-6
    Hinweis: Achten Sie darauf, dass der Gewährungstyp JWT ausgewählt ist

    Abonnieren Sie nun die API für die erstellte Anwendung

    Schritt 4 – Benutzeranmeldung und ID-Token (JWT) abrufen

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

    Hinweis: Die OpenID connect-Anmeldung kann unterschiedliche Grant-Typen verwenden. In diesem Beispiel wird davon ausgegangen, dass die Web-App Trusted ist und Zugriff auf die Benutzeranmeldedaten hat, und sie verwendet den Passwort-Grant, um sich anzumelden und OpenID connect-Tokens zu erhalten.

    Abfrage: Abrufen des Consumer Key und des Consumer Key von dem in Schritt 2 erstellten Service Provider „WebAPP“. Benutzername und Passwort sollten die Anmeldedaten eines Benutzers sein, der sich bei der Web APP anmeldet (verfügbar im 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

    Rückmeldung: Die Antwort enthält ein JWT-Token (id_token), das im nächsten Schritt zur Erzeugung eines OAuth-Tokens verwendet wird.

    {"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

    Schritt 5 – OAuth-Token für JWT-Token (id_token-Return) mit JWT-Grant generieren

    Der Benutzer hat sich nun bei der Web-App angemeldet und die Web-App hat das JWT-Token als OpenID-Connect-Antwort erhalten. Jetzt muss die Web-App im Namen des Benutzers auf die im API-Manager veröffentlichte API zugreifen.

    Also muss die Web-App zuerst ein gültiges OAuth-Token erhalten, indem sie das erhaltene JWT-Token mit dem JWT-Grant-Typ austauscht, indem sie den Token-Endpunkt in APIM aufruft.

    Abfrage: Rufen Sie den Consumer Key und das Consumer Secret von der App ab, die in Schritt 3 im API-Store erstellt wurde. Verwenden Sie den JWT-Grant-Typ, um das Token anzufordern. Benutzen Sie das im vorherigen Schritt erhaltene id_token für die Assertion.

    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 

    Rückmeldung: Enthält OAuth-Zugriffstoken, das für den Zugriff auf die API verwendet werden kann, die eine bestimmte App abonniert hat.

    {"access_token":"12c13079-9819-3676-ad64-6e46176a6607","refresh_token":"84a86921-b816-3a3a-94bf-6ea7c99cb376","scope":"default","token_type":"Bearer","expires_in":1886} 

    Schritt 6 – API aufrufen

    Benutzen Sie das in Schritt 5 erhaltene Zugriffstoken, um auf die veröffentlichte API zuzugreifen

    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"

    Fehlerbehebung

    Fehler beim Aufruf des Token-Endpunkts mit JWT-Grant-Typ.

    {"error_description":"None of the audience values matched the token. Endpoint Alias https://xxxxxx:9443/oauth2/token","error":"invalid_grant"}

    Dieser Fehler tritt auf, da die URL in der Audience Restriction des Dienstanbieters, der das JWT-Token generiert, nicht mit dem Token Endpoint Alias übereinstimmt, der in der Trusted IDP-Konfiguration in API Manager angegeben ist. Aktualisieren Sie zur Behebung die Konfigurationen mit der korrekten URL entsprechend.

    Sollten Sie Fragen zu den in diesem Blog beschriebenen Schritten haben, schreiben Sie bitte einen Kommentar unten. Bitte kontaktieren Sie uns für weitere Informationen zu unseren Support-Services.