Sichere dein Spring Backend jetzt mit OAuth2 ab

Image of Felix Klauke
Felix Klauke

Moderne Anwendungen haben in der Regel klar getrennt Module. Frontend und Backend werden penibel getrennt, um später auf einfache Art und Weise mehrere Frontends zu unterstützen und Testing zu vereinfachen. Der API-First Ansatz beschreibt dabei, dass sich primär um die API aka das Backend gekümmert wird. Es ist von Anfang an wichtig, eine konsistente und sichere API zu bauen. Bei Klauke Enterprises werden alle APIs mit OAuth2 bzw. OpenID abgesichert. Hier erfährst du, wie du das in deinem Spring Projekt umsetzt.

 

API Sicherheit

Wenn Frontend und Backend getrennt werden ist das Backend ganz klar ein offensichtliches Angriffsziel. Um hier allen Schutzzielen gerecht zu werden muss einiges an Sicherheitsmaßnahmen aufgefahren werden. Ohne weitere Sicherheitsmaßnahmen riskierst du:

  1. Dass Angreifer auf Ressourcen zugreifen, die ihnen nicht gehören. Das ist allein schon aus Datenschutz-Gründen höchstgefährlich!
  2. Dass Angreifer auf Bereiche der API zugreifen, auf die sie keinen Zugriff haben sollten

Wenn es nur ein Backend gibt werden unweigerlich Admin und User Funktionen gemischt. Diese gilt es sauber zu trennen, sonst hat ein Nutzer ganz schnell Zugriffe, die du bereuen könntest.

Es gibt mittlerweile eine ganze Reihe an Mechanismen, mit deinen eine API abgesichert werden kann. Wir gehen von einer simplen REST API aus, die per HTTPS angesprochen wird. Auf Anhieb fallen hier normale Basic Authentication via Username und Passwort oder die Nutzung von API Keys auf. Wir konzentrieren uns hier jedoch auf den etwas fortgeschrittenen Ansatz mit OAuth2.

 

OAuth2

Für viele nach wie vor eine undurchsichtige Blackbox ist OAuth2 dennoch ein starkes Tool. Es gibt einige sehr gute Beispiele und Guides, in denen ausführlich erklärt wird, wie OAuth2 arbeitet.

OAuth2 wird von vielen prominenten Diensten wie Google, Facebook und Twitter verwendet, um APIs und Anwendungen abzusichern. Es wird außerdem von allen gängigen Client oder API Libraries wie Swagger unterstützt und bildet eine Instanz, an der ihr euren Benutzer authentifiziert. Eine Web Anwendung, zum Beispiel euer Frontend, kann dabei eine Menge an Rechten anfragen, die du als Benutzer beim Login gewähren kannst. Die Anwendung bekommt daraufhin einen Access Token, mit dem sie für euch ein Backend anfragen kann.

Wir gucken uns nun an, wie du ein solches Backend in Spring einrichtest. 

 

API mit OAuth2 absichern

Wir reden nicht lange um den heißen Brei herum, wir brauchen zu aller erst einen Server, der die OAuth2 Authentifizierung ausstellt und auch überprüfen kann. Zu empfehlen sind hier zum Beispiel FusionAuth, Okta oder Keycloak

Haben wir diesen Server aufgesetzt, schnappen wir uns die jwk-set-uri, die relevant für die Validierung der Authentifizierung ist und konfigurieren sie in unserem Spring Projekt (Ich habe hier ein Beispielprojekt für dich) in der application.yml

 

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
         
jwk-set-uri: https://auth.klauke-enterprises.de/auth/realms/klauke-enterprises/protocol/openid-connect/certs

 

Diesen Wert lassen wir natürlich nur unangetastet. Wir bringen Spring nun auch noch bei, JWT Tokens zu dekodieren. Das ist nötig, damit wir mit den Daten weiterarbeiten können.

 

@EnableWebSecurity
@EnableGlobalMethodSecurity(
    prePostEnabled = true
)
public class OAuth2ResourceServerSecurityConfiguration extends WebSecurityConfigurerAdapter {
  @Value("${spring.security.oauth2.resourceserver.jwt.jwk-set-uri}")
  String jwkSetUri;

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests(authorizeRequests -> authorizeRequests.anyRequest().authenticated())
        .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
  }

  @Bean
  JwtDecoder jwtDecoder() {
    return NimbusJwtDecoder.withJwkSetUri(this.jwkSetUri).build();
  }
}

Und fertig! Ab jetzt kannst du die Global Method Security nutzen, um deine Endpunkte zu schützen. Ich habe dir hier ein Beispiel deponiert, wie du das in einem Spring RestController umsetzen kannst.

 

Fazit

Das Absichern der API ist am Ende kinderleicht und beschränkt sich auf ein paar Zeilen. Ich habe das noch einmal einfach und kompakt für dich in einem Beispielprojekt demonstriert. Abschließend lässt sich trotzdem sagen, dass das OAuth2 Setup komplex ist. Mit großer Macht kommt auch immer große Verantwortung. 

Für alle komplexen und wichtigen APIs kommt aber bei Klauke Enterprises nichts anderes infrage. Einfach , kleine APIs kann man problemlos mit API Keys absichern, das ist in manchen Fällen auch für den Frontend Entwickler wesentlich convenienter und trivialer. Für alle großen und wichtigen APIs sollte aber OAuth2 herhalten.

Wie sicherst du deine APIs ab? Schreib es in die Kommentare!

 

Kommentieren

Blog

Verwandte Artikel