Da sgcWebSockets 2024.5.0 PKCE, acronimo di "Proof of Key Code Exchange", è un'estensione del protocollo OAuth 2.0 che aiuta a prevenire gli attacchi di intercettazione di codice.
PKCE è supportato sui componenti OAuth2 Server e Client.
Cos'è PKCE
PKCE (Proof Key for Code Exchange) è un miglioramento di sicurezza per OAuth 2.0 progettato per proteggere dagli attacchi di intercettazione di codice di autorizzazione nelle applicazioni pubbliche o native. È descritto in RFC 7636 e funge da tecnica di mitigazione contro la vulnerabilità di "intercettazione di codice di autorizzazione", in particolare in ambienti in cui i client secret non possono essere mantenuti riservati in modo affidabile, come nelle applicazioni mobile o lato client.
In un tipico flusso OAuth 2.0 Authorization Code Grant, un'applicazione client ottiene un codice di autorizzazione reindirizzando l'utente a un server di autorizzazione e poi scambia il codice con un access token. Tuttavia, se un attaccante intercetta il codice di autorizzazione, potrebbe potenzialmente usarlo per ottenere l'access token e accedere a risorse protette.
PKCE affronta questo rischio introducendo un meccanismo di proof key. I componenti chiave di PKCE sono:
- Code Verifier: una stringa casuale ad alta entropia generata dall'applicazione client all'inizio del flusso OAuth. Il verifier deve essere lungo almeno 43 caratteri e al massimo 128, usando caratteri non riservati (A-Z, a-z, 0-9, "-", ".", "_", "~").
- Code Challenge: una versione derivata del code verifier, creata usando un metodo di trasformazione. Il metodo di trasformazione è solitamente "S256", che indica l'hashing SHA-256, ma può anche essere "plain", dove il code challenge coincide con il code verifier.
Il flusso PKCE funziona così:
- L'applicazione client genera un code verifier e da esso deriva il code challenge.
- L'applicazione client avvia la richiesta di autorizzazione OAuth, includendo il code challenge e il metodo di code challenge (plain o S256).
- Il server di autorizzazione invia il codice di autorizzazione al client dopo che l'utente ha concesso l'accesso.
- Quando l'applicazione client invia il codice di autorizzazione all'endpoint token per scambiarlo con un access token, include anche il code verifier.
- Il server di autorizzazione verifica il code verifier applicando lo stesso metodo di trasformazione usato per creare il code challenge e controlla se corrisponde al code challenge memorizzato.
- Se la verifica ha successo, il server di autorizzazione emette l'access token; altrimenti la richiesta viene rifiutata.
Questo meccanismo garantisce che solo il client con il code verifier originale possa scambiare con successo il codice di autorizzazione con un access token, fornendo un solido livello di sicurezza nei flussi OAuth.
Client OAuth2 per Delphi
Il componente TsgcHTTP_OAuth2_Client supporta il flusso Authorization Code + PKCE; per usare questo tipo di autorizzazione, imposta la proprietà GrantType al valore 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;
Server OAuth2 per Delphi
Il componente TsgcHTTP_OAuth2_Server supporta PKCE per impostazione predefinita (anche se può essere disabilitato nella proprietà OAuth2Options.PKCE). Quando il server rileva che il client OAuth2 sta usando PKCE, valida che i valori PKCE siano corretti; in caso contrario, la risposta restituirà un errore.
Trovi qui sotto un link su come usare il server OAuth2 per Delphi.
