Depuis sgcWebSockets 2024.5.0, PKCE, qui signifie « Proof of Key Code Exchange », est une extension du protocole OAuth 2.0 qui aide à prévenir les attaques par interception de code.
PKCE est pris en charge sur les composants serveur et client OAuth2.
Qu'est-ce que PKCE
PKCE (Proof Key for Code Exchange) est une amélioration de sécurité d'OAuth 2.0 conçue pour protéger contre les attaques par interception de code d'autorisation dans les applications publiques ou natives. Elle est détaillée dans RFC 7636 et sert de technique de mitigation contre la vulnérabilité d'« interception du code d'autorisation », en particulier dans les environnements où les secrets clients ne peuvent pas être conservés de manière fiable confidentielle, comme dans les applications mobiles ou côté client.
Dans un flux typique OAuth 2.0 Authorization Code Grant, une application cliente obtient un code d'autorisation en redirigeant l'utilisateur vers un serveur d'autorisation, puis échange le code contre un jeton d'accès. Cependant, si un attaquant intercepte le code d'autorisation, il pourrait potentiellement l'utiliser pour obtenir le jeton d'accès et accéder à des ressources protégées.
PKCE répond à ce risque en introduisant un mécanisme de clé de preuve. Les composants clés de PKCE sont :
- Code Verifier : une chaîne aléatoire à haute entropie générée par l'application cliente au début du flux OAuth. Le vérificateur doit avoir entre 43 et 128 caractères, en utilisant des caractères non réservés (A-Z, a-z, 0-9, « - », « . », « _ », « ~ »).
- Code Challenge : une version dérivée du code verifier, créée à l'aide d'une méthode de transformation. La méthode de transformation est généralement « S256 », indiquant le hachage SHA-256, mais elle peut aussi être « plain », où le code challenge est identique au code verifier.
Le flux PKCE fonctionne comme suit :
- L'application cliente génère un code verifier et en dérive le code challenge.
- L'application cliente initie la requête d'autorisation OAuth, incluant le code challenge et la méthode du code challenge (plain ou S256).
- Le serveur d'autorisation envoie le code d'autorisation au client après que l'utilisateur a accordé l'accès.
- Quand l'application cliente envoie le code d'autorisation à l'endpoint de token pour l'échanger contre un jeton d'accès, elle inclut également le code verifier.
- Le serveur d'autorisation vérifie le code verifier en appliquant la même méthode de transformation utilisée pour créer le code challenge et vérifie s'il correspond au code challenge stocké.
- Si la vérification est réussie, le serveur d'autorisation émet le jeton d'accès ; sinon, la requête est rejetée.
Ce mécanisme garantit que seul le client possédant le code verifier d'origine peut échanger avec succès le code d'autorisation contre un jeton d'accès, fournissant une couche de sécurité robuste dans les flux OAuth.
Client Delphi OAuth2
Le composant TsgcHTTP_OAuth2_Client prend en charge le flux Authorization Code + PKCE. Pour utiliser ce type d'autorisation, définis la propriété GrantType à la valeur 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;
Serveur Delphi OAuth2
Le composant TsgcHTTP_OAuth2_Server prend en charge PKCE par défaut (bien qu'on puisse le désactiver via la propriété OAuth2Options.PKCE). Quand le serveur détecte que le client OAuth2 utilise PKCE, il valide que les valeurs PKCE sont valides ; sinon, la réponse renverra une erreur.
Voici un lien sur l'utilisation du serveur Delphi OAuth2.
