Vanaf sgcWebSockets 2024.5.0 is PKCE, dat staat voor "Proof of Key Code Exchange", een uitbreiding van het OAuth 2.0-protocol die helpt code-interceptie-aanvallen te voorkomen.
PKCE wordt ondersteund door de OAuth2 Server- en Client-componenten.
Wat is PKCE
PKCE (Proof Key for Code Exchange) is een OAuth 2.0-beveiligingsverbetering die is ontworpen om bescherming te bieden tegen aanvallen waarbij de autorisatiecode wordt onderschept in publieke of native toepassingen. Het wordt beschreven in RFC 7636 en dient als mitigatietechniek tegen de kwetsbaarheid "autorisatiecode-interceptie", met name in omgevingen waar client-secrets niet betrouwbaar geheim kunnen worden gehouden, zoals in mobiele of client-side-toepassingen.
In een typische OAuth 2.0 Authorization Code Grant-flow verkrijgt een client-toepassing een autorisatiecode door de gebruiker door te sturen naar een autorisatieserver, en wisselt de code vervolgens in voor een access-token. Als een aanvaller echter de autorisatiecode onderschept, kan hij die mogelijk gebruiken om het access-token te bemachtigen en beschermde resources te benaderen.
PKCE pakt dit risico aan door een proof-key-mechanisme te introduceren. De belangrijkste onderdelen van PKCE zijn:
- Code-verifier: een willekeurige string met hoge entropie die de client-toepassing aan het begin van de OAuth-flow genereert. De verifier moet minimaal 43 en maximaal 128 tekens lang zijn, en bestaan uit niet-gereserveerde tekens (A-Z, a-z, 0-9, "-", ".", "_", "~").
- Code-challenge: een afgeleide versie van de code-verifier, gemaakt via een transformatie-methode. De transformatie-methode is meestal "S256", wat staat voor SHA-256-hashing, maar kan ook "plain" zijn, waarbij de code-challenge gelijk is aan de code-verifier.
De PKCE-flow werkt als volgt:
- De client-toepassing genereert een code-verifier en leidt daaruit de code-challenge af.
- De client-toepassing start het OAuth-autorisatie-request en stuurt daarbij de code-challenge en de code-challenge-methode (plain of S256) mee.
- De autorisatieserver stuurt de autorisatiecode naar de client nadat de gebruiker toegang heeft verleend.
- Wanneer de client-toepassing de autorisatiecode naar het token-endpoint stuurt om die in te wisselen voor een access-token, stuurt hij ook de code-verifier mee.
- De autorisatieserver verifieert de code-verifier door dezelfde transformatie-methode toe te passen die is gebruikt om de code-challenge te maken, en controleert of die overeenkomt met de opgeslagen code-challenge.
- Als de verificatie slaagt, geeft de autorisatieserver het access-token uit; zo niet, dan wordt het request afgewezen.
Dit mechanisme zorgt ervoor dat alleen de client met de oorspronkelijke code-verifier de autorisatiecode succesvol kan inwisselen voor een access-token, en biedt zo een robuuste beveiligingslaag in OAuth-flows.
Delphi OAuth2-client
Het component TsgcHTTP_OAuth2_Client ondersteunt de Authorization Code + PKCE-flow. Om dit autorisatietype te gebruiken, stel je de eigenschap GrantType in op de waarde 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
Het component TsgcHTTP_OAuth2_Server ondersteunt PKCE standaard (al kan dit worden uitgeschakeld in de eigenschap OAuth2Options.PKCE). Wanneer de server detecteert dat de OAuth2-client PKCE gebruikt, valideert hij of de PKCE-waarden geldig zijn; zo niet, dan retourneert de respons een fout.
Hieronder een link over hoe je de Delphi OAuth2-server gebruikt.
