Delphi PKCE OAuth2

· 機能

From sgcWebSockets 2024.5.0 PKCE, which stands for "Proof of Key Code Exchange" is an extension of the OAuth 2.0 protocol that helps prevent code interception attacks.

PKCE は OAuth2 サーバーコンポーネントと クライアントコンポーネントの両方でサポートされています。

PKCE とは

PKCE(Proof Key for Code Exchange)は、パブリックまたはネイティブアプリケーションにおける認可コード傍受攻撃を防ぐための OAuth 2.0 セキュリティ強化機能です。RFC 7636 で詳述されており、特にモバイルやクライアントサイドアプリケーションなど、クライアントシークレットを安全に保持できない環境での「認可コード傍受」脆弱性の軽減手法として機能します。

典型的な OAuth 2.0 認可コードグラントフローでは、クライアントアプリケーションはユーザーを認可サーバーにリダイレクトすることで認可コードを取得し、そのコードをアクセストークンと交換します。しかし、攻撃者が認可コードを傍受した場合、そのコードを使用してアクセストークンを取得し、保護されたリソースにアクセスされる可能性があります。

PKCE はプルーフキーメカニズムを導入することでこのリスクに対処しています。PKCE の主要コンポーネントは次のとおりです:


PKCE フローは次のように機能します:

  1. クライアントアプリケーションはコードベリファイアーを生成し、そこからコードチャレンジを導出します。
  2. クライアントアプリケーションは、コードチャレンジとコードチャレンジメソッド(plain または S256)を含む OAuth 認可リクエストを開始します。
  3. ユーザーがアクセスを許可した後、認可サーバーはクライアントに認可コードを送信します。
  4. クライアントアプリケーションがアクセストークンと交換するために認可コードをトークンエンドポイントに送信する際、コードベリファイアーも含めます。
  5. 認可サーバーはコードチャレンジの作成に使用したのと同じ変換メソッドを適用してコードベリファイアーを検証し、保存されたコードチャレンジと一致するかどうかを確認します。
  6. 検証が成功した場合、認可サーバーはアクセストークンを発行します。そうでない場合はリクエストが拒否されます。

このメカニズムにより、元のコードベリファイアーを持つクライアントのみが認可コードをアクセストークンと正常に交換できることが保証され、OAuth フローに堅牢なセキュリティ層を提供します。

Delphi OAuth2 クライアント

The TsgcHTTP_OAuth2_Client component supports the Authorization Code + PKCE Flow, in order to use this authorization type, set the property GrantType  to the value 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 サーバー

TsgcHTTP_OAuth2_Server コンポーネントはデフォルトで PKCE をサポートしています(プロパティ OAuth2Options.PKCE で無効にできます)。サーバーが OAuth2 クライアントが PKCE を使用していることを検出すると、PKCE の値が有効かどうかを検証し、無効な場合はレスポンスがエラーを返します。

Delphi OAuth2 サーバーの使用方法については、以下のリンクをご参照ください。

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