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:
- Code Verifier: Losowy ciąg o wysokiej entropii generowany przez aplikację kliencką na początku przepływu OAuth. Weryfikator musi mieć od 43 do 128 znaków, używając niezarezerwowanych znaków (A-Z, a-z, 0-9, "-", ".", "_", "~").
- Code Challenge: Pochodna wersja code verifier, tworzona za pomocą metody transformacji. Metoda to zwykle "S256" (haszowanie SHA-256), ale może to być też "plain", gdzie code challenge jest identyczny z code verifier.
Przepływ PKCE wygląda następująco:
- Aplikacja kliencka generuje code verifier i na jego podstawie tworzy code challenge.
- Aplikacja kliencka inicjuje żądanie autoryzacji OAuth, podając code challenge i metodę (plain lub S256).
- Serwer autoryzacyjny wysyła kod autoryzacyjny do klienta po udzieleniu dostępu przez użytkownika.
- 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.
- Serwer autoryzacyjny weryfikuje code verifier stosując tę samą metodę transformacji co przy tworzeniu code challenge i sprawdza, czy pasuje do przechowywanego code challenge.
- 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.
