Delphi PKCE OAuth2

· Funktionen

Ab sgcWebSockets 2024.5.0 PKCE, was für "Proof of Key Code Exchange" steht, ist eine Erweiterung des OAuth 2.0-Protokolls, die Code-Interception-Angriffe verhindert.

PKCE wird in den OAuth2 Server- und Client-Komponenten unterstützt.

Was ist PKCE

PKCE (Proof Key for Code Exchange) ist eine OAuth 2.0-Sicherheitserweiterung, die vor Authorization-Code-Interception-Angriffen in öffentlichen oder nativen Anwendungen schützt. Sie ist in RFC 7636 beschrieben und dient als Schutzmechanismus gegen die "Authorization Code Interception"-Schwachstelle, insbesondere in Umgebungen, in denen Client Secrets nicht zuverlässig geheim gehalten werden können, wie bei mobilen oder clientseitigen Anwendungen.

In einem typischen OAuth 2.0 Authorization Code Grant-Flow erhält eine Client-Anwendung einen Authorization Code, indem sie den Benutzer zu einem Authorization Server umleitet, und tauscht den Code dann gegen ein Access Token ein. Fängt ein Angreifer jedoch den Authorization Code ab, könnte er diesen potenziell nutzen, um das Access Token zu erhalten und auf geschützte Ressourcen zuzugreifen.

PKCE begegnet diesem Risiko durch die Einführung eines Proof-Key-Mechanismus. Die zentralen Komponenten von PKCE sind:


Der PKCE-Flow funktioniert wie folgt:

  1. Die Client-Anwendung erzeugt einen Code Verifier und leitet daraus die Code Challenge ab.
  2. Die Client-Anwendung initiiert die OAuth-Autorisierungsanfrage und schließt die Code Challenge sowie die Code-Challenge-Methode (plain oder S256) ein.
  3. Der Authorization Server sendet den Authorization Code an den Client, nachdem der Benutzer den Zugriff gewährt hat.
  4. Wenn die Client-Anwendung den Authorization Code an den Token-Endpunkt sendet, um ihn gegen ein Access Token einzutauschen, fügt sie auch den Code Verifier hinzu.
  5. Der Authorization Server überprüft den Code Verifier, indem er dieselbe Transformationsmethode anwendet, die zur Erstellung der Code Challenge verwendet wurde, und prüft, ob er mit der gespeicherten Code Challenge übereinstimmt.
  6. Ist die Verifizierung erfolgreich, gibt der Authorization Server das Access Token aus; andernfalls wird die Anfrage abgelehnt.

Dieser Mechanismus stellt sicher, dass nur der Client mit dem ursprünglichen Code Verifier den Authorization Code erfolgreich gegen ein Access Token eintauschen kann, und bietet so eine robuste Sicherheitsebene in OAuth-Flows.

Delphi OAuth2 Client

Die Komponente TsgcHTTP_OAuth2_Client unterstützt den Authorization Code + PKCE-Flow. Um diesen Autorisierungstyp zu verwenden, setze die Eigenschaft GrantType auf den Wert auth2CodePKCE.

oAuth2 := TsgcHTTP2_OAuth2.Create(nil);
oAuth2.LocalServerOptions.Host := '127.0.0.1';
oAuth2.LocalServerOptions.Port := 8080;
oAuth2.AuthorizationServerOptions.AuthURL := 'https://accounts.google.com/o/oauth2/auth';
oAuth2.AuthorizationServerOptions.TokenURL := 'https://accounts.google.com/o/oauth2/token';
oAuth2.AuthorizationServerOptions.Scope.Add('https://mail.google.com/');
oAuth2.OAuth2Options.ClientId := '180803918357-eqjtn20gqfhcs6gjkebbrrenh022mqqc.apps.googleusercontent.com';
oAuth2.OAuth2Options.ClientSecret := '_by0iYYrvVHxC2Z8TbtNEYQN';
oAuth2.OAuth2Options.GrantType := auth2CodePKCE;
procedure OnOAuth2AfterAccessToken(Sender: TObject; const Access_Token, Token_Type, Expires_In, 
  Refresh_Token, Scope, RawParams: string; var Handled: Boolean);
begin
  <...>
  <...>
end;
oAuth2.OnAfterAccessToken := OnOAuth2AfterAccessToken;
oAuth2.Start; 

Delphi OAuth2 Server

Die Komponente TsgcHTTP_OAuth2_Server unterstützt PKCE standardmäßig (kann aber in der Eigenschaft OAuth2Options.PKCE deaktiviert werden). Wenn der Server erkennt, dass der OAuth2-Client PKCE verwendet, validiert er, ob die PKCE-Werte gültig sind. Andernfalls gibt die Antwort einen Fehler zurück.

Unten findest du einen Link, wie du den Delphi OAuth2 Server verwendest.

https://www.esegece.com/help/sgcWebSockets/#t=Components%2FHTTP%2FAuthorization%2FOAuth2%2Fserver%2FQuickStart%2FOAuth2_Server_Example.htm