PKCE OAuth2 w Delphi

· Features

Od sgcWebSockets 2024.5.0 PKCE (Proof of Key Code Exchange) jest rozszerzeniem protokołu OAuth 2.0 zapobiegającym atakom przechwycenia kodu autoryzacyjnego.

PKCE jest obsługiwane w komponentach OAuth2 Server i Client.

Czym jest PKCE

PKCE (Proof Key for Code Exchange) to ulepszenie bezpieczeństwa OAuth 2.0 chroniące przed atakami przechwycenia kodu autoryzacyjnego w aplikacjach publicznych lub natywnych. Opisane jest w RFC 7636 i stanowi technikę mitygacji podatności "authorization code interception", szczególnie w środowiskach, gdzie sekrety klienta nie mogą być pewnie utrzymywane w poufności, jak w aplikacjach mobilnych lub po stronie klienta.

W typowym przepływie OAuth 2.0 Authorization Code Grant aplikacja kliencka uzyskuje kod autoryzacyjny przekierowując użytkownika do serwera autoryzacyjnego, a następnie wymienia kod na token dostępu. Jeśli jednak atakujący przechwytuje kod autoryzacyjny, może potencjalnie użyć go do uzyskania tokenu dostępu i dostępu do chronionych zasobów.

PKCE adresuje to ryzyko przez wprowadzenie mechanizmu klucza dowodowego. Kluczowe elementy PKCE to:


Przepływ PKCE wygląda następująco:

  1. Aplikacja kliencka generuje code verifier i na jego podstawie tworzy code challenge.
  2. Aplikacja kliencka inicjuje żądanie autoryzacji OAuth, podając code challenge i metodę (plain lub S256).
  3. Serwer autoryzacyjny wysyła kod autoryzacyjny do klienta po udzieleniu dostępu przez użytkownika.
  4. Gdy aplikacja kliencka wysyła kod autoryzacyjny do punktu końcowego tokenów w celu wymiany na token dostępu, dołącza również code verifier.
  5. Serwer autoryzacyjny weryfikuje code verifier stosując tę samą metodę transformacji co przy tworzeniu code challenge i sprawdza, czy pasuje do przechowywanego code challenge.
  6. Jeśli weryfikacja jest pomyślna, serwer autoryzacyjny wystawia token dostępu; w przeciwnym razie żądanie jest odrzucane.

Mechanizm ten zapewnia, że tylko klient posiadający oryginalny code verifier może pomyślnie wymienić kod autoryzacyjny na token dostępu, zapewniając solidną warstwę bezpieczeństwa w przepływach OAuth.

Klient OAuth2 w Delphi

Komponent TsgcHTTP_OAuth2_Client obsługuje przepływ Authorization Code + PKCE. Aby użyć tego typu autoryzacji, ustaw właściwość GrantType na wartość 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; 

Serwer OAuth2 w Delphi

Komponent TsgcHTTP_OAuth2_Server domyślnie obsługuje PKCE (choć można je wyłączyć właściwością OAuth2Options.PKCE). Gdy serwer wykryje, że klient OAuth2 używa PKCE, sprawdza poprawność wartości PKCE; jeśli są nieprawidłowe, zwraca błąd.

Poniżej znajdziesz link z informacjami o używaniu serwera OAuth2 Delphi.

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