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 の主要コンポーネントは次のとおりです:
- コードベリファイアー: OAuth フローの開始時にクライアントアプリケーションが生成するランダムな高エントロピーの文字列。ベリファイアーは予約されていない文字(A-Z、a-z、0-9、"-"、"."、"_"、"~")を使用し、最低 43 文字、最大 128 文字でなければなりません。
- コードチャレンジ: 変換メソッドを使用して作成されたコードベリファイアーの派生バージョン。変換メソッドは通常 SHA-256 ハッシングを示す "S256" ですが、コードチャレンジがコードベリファイアーと同一となる "plain" も使用できます。
PKCE フローは次のように機能します:
- クライアントアプリケーションはコードベリファイアーを生成し、そこからコードチャレンジを導出します。
- クライアントアプリケーションは、コードチャレンジとコードチャレンジメソッド(plain または S256)を含む OAuth 認可リクエストを開始します。
- ユーザーがアクセスを許可した後、認可サーバーはクライアントに認可コードを送信します。
- クライアントアプリケーションがアクセストークンと交換するために認可コードをトークンエンドポイントに送信する際、コードベリファイアーも含めます。
- 認可サーバーはコードチャレンジの作成に使用したのと同じ変換メソッドを適用してコードベリファイアーを検証し、保存されたコードチャレンジと一致するかどうかを確認します。
- 検証が成功した場合、認可サーバーはアクセストークンを発行します。そうでない場合はリクエストが拒否されます。
このメカニズムにより、元のコードベリファイアーを持つクライアントのみが認可コードをアクセストークンと正常に交換できることが保証され、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 サーバーの使用方法については、以下のリンクをご参照ください。
