Generierung von Client APIs mit Swagger Teil 2

Im zweiten Teil der Serie sichern wir die Endpoints mit Auth0 und autorisieren die Anfragen des Web-Clients mit OAuth2.

  • Andreas Riepl Andreas Riepl
  • date icon

    10. Sep. 2021

Generierung von Client APIs mit Swagger Teil 2

Also available in English at Medium.com.

In diesem Blog-Post stellen wir die Client-Generierung von Swagger vor, zeigen, wie man die generierte API in React-Anwendungen verwendet und wie man das Authentifizierungs-Token von Auth0 integriert.

Der Einfachheit halber wird dieses Thema in eine dreiteilige Serie aufgeteilt:

  1. Teil 1: Integration von Swagger in Spring Boot, Generierung des API-Clients und Verwendung als Teil einer React-Web-App
  2. Teil 2: Sicherung der Endpunkte mit Auth0 und Autorisierung der Anfragen der Web-Clients
  3. Teil 3: Verwendung des generierten API-Clients als Teil einer React Native App.

Sichern der Endpoints mit Auth0 und Autorisierung der Webclient-Anfragen

Im zweiten Teil unserer Blogpost-Serie sichern wir unsere Web-Anwendung mit OAuth2 unter Verwendung von Auth0. Auth0 nennt sich selbst “eine einfach zu implementierende, anpassungsfähige Authentifizierungs- und Autorisierungsplattform” und bietet einen kostenlosen Tarif für bis zu 7000 Benutzer an. In diesem Beitrag wird die Integration von Auth0 in das Spring Boot Backend und die React-Webanwendung behandelt.

TL;DR

  1. Erstellen Sie einen neuen Tenant in Auth0, wie in Schritt 1 beschrieben.
  2. Klonen Sie unser Beispiel-Backend und starten Sie die Docker-Services.
  3. Setzen Sie in der src/main/resources/application.properties den Wert spring.security.oauth2.resourceserver.jwt.issuer-uri=https://<tenant>.eu.auth0.com, um den neuen Tenant zu nutzen.
  4. Starten Sie das Backend ohne no-security-Profil.
  5. Klonen Sie unsere Gesicherte Beispiel-Web-App und installieren Sie alle Abhängigkeiten mit yarn install.
  6. Setzen Sie die folgenden Umgebungsvariablen in der Run-Konfiguration der Web-Anwendung:
    REACT_APP_DOMAIN=<IHRE_DOMAIN> (z.B.: https://miragon-example-tenant.eu.auth0.com);
    REACT_APP_CLIENT_ID=<IHRE_CLIENT_ID> (z.B.: yXu7adklfU729Hgsdg93p0gag9dC);
  7. Starten Sie die Anwendung mit yarn start.

Schritt 1) Erstellen eines Auth0-Kontos, Anlegen eines neuen Tenants und einer neuen Anwendung.

  1. Besuchen Sie Auth0 und erstellen Sie ein neues Konto: https://auth0.com/.
  2. Erstellen Sie einen neuen Tenant: Klicken Sie auf Ihren Default-Tenant und wählen Sie “Create Tenant”.
  3. Erstellen Sie eine neue Anwendung: Anwendungen → “Create Application” → “Single Web Page Applications”.
  4. Konfigurieren Sie Ihre Anwendung: Ändern Sie den Namen und setzen Sie “Allowed Callback URLs” sowie “Allowed Web Origins” auf “http://localhost:8080/” und speichern Sie die Änderungen (den Button finden Sie am unteren Rand des Formulars”).
  5. Erstellen Sie einen Benutzer: User Management → Users → Create User

Schritt 2) Backend-Anwendung sichern

Setzen Sie in der src/main/resources/application.properties den Wert spring.security.oauth2.resourceserver.jwt.issuer-uri=<AUTH0_TENANT_DOMAIN>, um Ihren Auth0-Tenant zu verwenden. Die Domain kann auf der Anwendungsseite in Auth0 gefunden werden.

Sie können Ihr Backend mit der folgenden Security-Konfiguration schützen (Sie finden diese Klasse im Beispiel-Backend im Ordner shared/security):

@Profile("!no-security")
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(final HttpSecurity http) throws Exception {

        http.authorizeRequests()
                .antMatchers("/actuator/health").permitAll()
                .antMatchers("/v3/api-docs/**",
                        "/swagger-resources",
                        "/swagger-resources/**",
                        "/configuration/ui",
                        "/configuration/security",
                        "/swagger-ui.html",
                        "/swagger-ui/**",
                        "/webjars/**").permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .oauth2ResourceServer(
                        OAuth2ResourceServerConfigurer::jwt
                );

        http.headers().frameOptions().sameOrigin();
        http.csrf().disable();
        http.sessionManagement()
                .sessionCreationPolicy(
                        SessionCreationPolicy.STATELESS
                );
    }

    @Bean
    public JwtDecoder jwtDecoderByIssuerUri(
        final OAuth2ResourceServerProperties properties
    ) {
        final String issuerUri = properties.getJwt().getIssuerUri();
        return JwtDecoders.fromIssuerLocation(issuerUri);
    }
}

Schritt 3) Web-App sichern

Wir werden Auth0s Benutzername & Passwort-Authentifizierung verwenden, die erscheinen sollte, wenn der Benutzer nicht angemeldet ist.

Der Login-Screen von Auth0:

3a) Hinzufügen des Auth0-Providers

Installieren Sie die erforderliche Abhängigkeit über yarn add @auth0/auth0-react und fügen Sie den Provider in Ihre Anwendung ein (index.tsx):

<Auth0Provider
    domain={process.env.REACT_APP_DOMAIN ?? ""}
    clientId={process.env.REACT_APP_CLIENT_ID ?? ""}
    authorizeTimeoutSeconds={5}
    useRefreshTokensIn
    redirectUri={window.location.origin}>
    <HashRouter>
        <App/>
    </HashRouter>
</Auth0Provider>

Die Domain und die Client-ID finden Sie in der Auth0-Anwendung, die Sie oben erstellt haben.

3b) Speichern des Tokens im Local Browser Storage:

Wenn sich der Benutzer erfolgreich angemeldet hat, können wir nun das JWT-Token im lokalen Browser-Speicher ablegen, um von jeder Seite aus darauf zuzugreifen (src/components/Layout/Layout.tsx):

(async () => {
    const token = await getIdTokenClaims();
    localStorage.setItem("token", token.__raw)
})();

Der Token im lokalen Browser-Speicher:

3c) Konfiguration der Swagger-API

Verwenden Sie die Configuration-Klasse, um den Authentifizierungsheader zu setzen (src/constants/Functions.tsx):

getClientConfig: function (): Configuration {
    return new Configuration({
        baseOptions: {
            "headers": {
                'Authorization': `Bearer ${this.getBearerToken()}`,
            }
        }
    })
},
getBearerToken: function (): string | null {
    return localStorage.getItem("token");
}

3d) Konfiguration beim Erstellen eines API-Client setzen.

Mit dieser Konfiguration können Sie jetzt authentifizierte Anfragen an die gesicherten Endpoints Ihres Backends senden:

const config = getClientConfig();
const projectController = new ProjectControllerApi(config)
const response = await projectController.getAllProject()
const data = response.data

Im dritten - und letzten - Teil dieser Serie werden wir einen genaueren Blick darauf werfen, wie man den generierten API-Client als Teil einer React Native App verwendet. Bis zum nächsten Mal!

Fand den Artikel interessant?

Abonniere unseren Newsletter und erhalte neue Beiträge direkt ins Postfach.

Insights

Aktuelle Beiträge

Die neuesten Artikel aus unserem Blog: technische Deep Dives, Erfahrungsberichte und Einblicke in unsere Arbeit.

Leveling up! Wie du die Herausforderung verteilter Transaktionen in Zeebe lösen kannst
date icon

01. Dez. 2025 · Marco Schäck

Leveling up! Wie du die Herausforderung verteilter Transaktionen in Zeebe lösen kannst

Ein umfassender Guide zu verteilten Transaktionen in Zeebe: Von Phantom-Instanzen über das Outbox Pattern bis hin zu Idempotenz und SAGA.

Weiterlesen
Komplexität navigieren: Von Verwirrung zu Klarheit durch klare Perspektiven
date icon

24. Okt. 2025 · Marco Schäck

Komplexität navigieren: Von Verwirrung zu Klarheit durch klare Perspektiven

Zwei Perspektiven zur Kategorisierung von Komplexität in Softwaresystemen: Wo lebt sie (lokal vs. global) und warum existiert sie (essenziell vs. akzidentell)?

Weiterlesen
Komplexität meistern – Wie Prozessautomatisierung gelingt
date icon

12. Mai 2025 · Dominik Horn

Komplexität meistern – Wie Prozessautomatisierung gelingt

Erfahrungen aus einem Jahrzehnt Prozessautomatisierung: Warum Kontext, Teamstrukturen und organisatorische Reife wichtiger sind als Technologie allein.

Weiterlesen

Innerhalb eines Tages weißt du, wo du stehst.

Kein Verkaufsgespräch, sondern eine ehrliche Einschätzung, ob und wie Automatisierung dir hilft. Kostenfrei.

Termin buchen

Kein Commitment. Kein Pitch-Deck. Nur Klarheit.