Delphi PKCE OAuth2

· Özellikler

sgcWebSockets 2024.5.0 sürümünden itibaren, "Proof of Key Code Exchange" anlamına gelen PKCE, kod ele geçirme saldırılarını önlemeye yardımcı olan OAuth 2.0 protokolünün bir uzantısıdır.

PKCE, OAuth2 Sunucu ve İstemci Bileşenlerinde desteklenir.

PKCE nedir

PKCE (Proof Key for Code Exchange), genel veya yerel uygulamalarda yetkilendirme kodu ele geçirme saldırılarına karşı koruma sağlamak üzere tasarlanmış bir OAuth 2.0 güvenlik geliştirmesidir. RFC 7636'da ayrıntılı olarak açıklanmıştır ve özellikle mobil veya istemci tarafı uygulamalar gibi istemci gizli anahtarlarının güvenilir bir şekilde gizli tutulamadığı ortamlarda "yetkilendirme kodu ele geçirme" güvenlik açığına karşı bir hafifletme tekniği olarak hizmet eder.

Tipik bir OAuth 2.0 Authorization Code Grant akışında, bir istemci uygulaması kullanıcıyı bir yetkilendirme sunucusuna yönlendirerek bir yetkilendirme kodu elde eder ve ardından kodu bir erişim belirteciyle takas eder. Ancak, bir saldırgan yetkilendirme kodunu ele geçirirse, bunu potansiyel olarak erişim belirtecini elde etmek ve korumalı kaynaklara erişmek için kullanabilir.

PKCE, bir kanıt anahtarı mekanizması sunarak bu riski ele alır. PKCE'nin temel bileşenleri şunlardır:


PKCE akışı şu şekilde çalışır:

  1. İstemci uygulaması bir kod doğrulayıcı oluşturur ve kod challenge'ı ondan türetir.
  2. İstemci uygulaması, kod challenge ve kod challenge yöntemi (plain veya S256) dahil olmak üzere OAuth yetkilendirme isteğini başlatır.
  3. Yetkilendirme sunucusu, kullanıcı erişim verdikten sonra yetkilendirme kodunu istemciye gönderir.
  4. İstemci uygulaması, yetkilendirme kodunu bir erişim belirteciyle takas etmek için belirteç uç noktasına gönderdiğinde, kod doğrulayıcıyı da dahil eder.
  5. Yetkilendirme sunucusu, kod challenge oluşturmak için kullanılan aynı dönüştürme yöntemini uygulayarak kod doğrulayıcıyı doğrular ve saklanan kod challenge ile eşleşip eşleşmediğini kontrol eder.
  6. Doğrulama başarılı olursa, yetkilendirme sunucusu erişim belirtecini verir; aksi takdirde istek reddedilir.

Bu mekanizma, yalnızca orijinal kod doğrulayıcıya sahip istemcinin yetkilendirme kodunu bir erişim belirteciyle başarıyla takas edebilmesini sağlar ve OAuth akışlarında sağlam bir güvenlik katmanı sunar.

Delphi OAuth2 İstemcisi

TsgcHTTP_OAuth2_Client bileşeni, Authorization Code + PKCE Akışını destekler; bu yetkilendirme türünü kullanmak için GrantType özelliğini   auth2CodePKCE değerine ayarlayın.

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 Sunucusu

TsgcHTTP_OAuth2_Server bileşeni PKCE'yi varsayılan olarak destekler (ancak OAuth2Options.PKCE özelliğinde devre dışı bırakılabilir). Sunucu, OAuth2 İstemcisinin PKCE kullandığını algıladığında, PKCE değerlerinin geçerli olup olmadığını doğrular; geçerli değilse, yanıt bir hata döndürür.

Delphi OAuth2 Sunucusunun nasıl kullanılacağına dair bir bağlantıyı aşağıda bulabilirsiniz.

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