Delphi OpenID Connect クライアント

Google、Microsoft Entra ID、Okta、Auth0、Keycloak、AWS Cognito でユーザーをサインインさせ、その身元を確認します。このコンポーネントはプロバイダーを検出し、PKCE と nonce を使ったブラウザフローを実行し、返却されたIDトークンを検証します。

TsgcHTTP_OIDC_Client

OAuth2 クライアントに OpenID Connect の ID レイヤーを追加します。ディスカバリー、既定で有効な PKCE と nonce、プロバイダーの署名鍵によるIDトークン検証、userinfo エンドポイントを提供します。

コンポーネントクラス

TsgcHTTP_OIDC_Client(ユニット sgcAuth_OIDC_Client

プロトコル

OpenID Connect Core 1.0

対応プラットフォーム

Windows, macOS, Linux, iOS, Android

エディション

Enterprise および All-Access、加えて sgcAuth パックでも利用できます。sgcWebSockets .NET でも利用可能です。

発行者を設定し、サインインを開始する

OIDCOptions.Issuer とクライアント資格情報を設定して Start を呼び出し、OnOIDCIDToken で検証済みのクレームを読み取ります。エンドポイントが未設定の場合、ディスカバリーは自動的に実行されます。

uses
  sgcAuth_OIDC_Client;

// OIDC はフォームフィールドです:OIDC: TsgcHTTP_OIDC_Client;
procedure TForm1.SignIn;
begin
  OIDC := TsgcHTTP_OIDC_Client.Create(nil);
  OIDC.OnOIDCIDToken := OnOIDCIDTokenEvent;

  OIDC.OIDCOptions.Issuer := 'https://accounts.google.com';
  OIDC.OAuth2Options.ClientId := 'your-client-id';
  OIDC.OAuth2Options.ClientSecret := 'your-client-secret';
  OIDC.AuthorizationServerOptions.Scope.Clear;
  OIDC.AuthorizationServerOptions.Scope.Add('openid');
  OIDC.AuthorizationServerOptions.Scope.Add('profile');
  OIDC.AuthorizationServerOptions.Scope.Add('email');

  OIDC.LocalServerOptions.IP := '127.0.0.1';
  OIDC.LocalServerOptions.Port := 8080;
  OIDC.LocalServerOptions.RedirectURL := 'http://127.0.0.1:8080/';

  // ディスカバリーの後、PKCE と nonce を使ったブラウザサインインへ
  OIDC.Start;
end;

procedure TForm1.OnOIDCIDTokenEvent(Sender: TObject; const aClaims: string;
  aValid: Boolean; const aError: string);
begin
  if aValid then
    Memo1.Lines.Text := aClaims // sub、email、name などを含む JSON
  else
    ShowMessage(aError);
end;
// uses: sgcAuth_OIDC_Client
TsgcHTTP_OIDC_Client *OIDC = new TsgcHTTP_OIDC_Client(this);
OIDC->OnOIDCIDToken = OnOIDCIDTokenEvent;

OIDC->OIDCOptions->Issuer = "https://accounts.google.com";
OIDC->OAuth2Options->ClientId = "your-client-id";
OIDC->OAuth2Options->ClientSecret = "your-client-secret";
OIDC->AuthorizationServerOptions->Scope->Clear();
OIDC->AuthorizationServerOptions->Scope->Add("openid");
OIDC->AuthorizationServerOptions->Scope->Add("profile");
OIDC->AuthorizationServerOptions->Scope->Add("email");

OIDC->LocalServerOptions->IP = "127.0.0.1";
OIDC->LocalServerOptions->Port = 8080;
OIDC->LocalServerOptions->RedirectURL = "http://127.0.0.1:8080/";

OIDC->Start();

主な機能

OAuth2 クライアントの機能に加え、アクセストークンを信頼できるIDへと変える検証をすべて備えています。

ディスカバリー

DiscoverOIDCOptions.Issuer のプロバイダー構成を読み取り、認可URL、トークンURL、JWKSURIUserInfoEndpointEndSessionEndpoint を設定します。生のJSONは DiscoveryDocument に保持されます。

既定で有効な PKCE と nonce

OIDCOptions.UsePKCE は標準で有効になっており、サインインのたびに新しい Nonce が送信されて IDトークンで照合されるため、傍受されたコードやリプレイされたトークンは無効になります。

厳格なIDトークン検証

署名、発行者、対象者、(ClockSkew を考慮した)有効期限、nonce が検証されます。受け入れられるのは RS256、RS384、RS512、ES256、ES384 のみで、none と HS系アルゴリズムは常に拒否されます。結果は IDTokenIDTokenClaimsIDTokenValid に格納されます。

鍵ローテーションへの対応

TsgcOIDCJWKS はプロバイダーの署名鍵をキャッシュするスレッドセーフなキャッシュです。未知のキーIDを持つトークンを受け取ると、RefetchInterval の制限内で再ダウンロードが行われるため、鍵のローテーションに再起動は不要です。

サーバー側での検証

sgcOIDC_ValidateIDToken は、REST API や WebSocket サーバーが受け取るベアラートークンを同じJWKSキャッシュに対して検証します。OIDCOptions.AllowedTenants は、マルチテナントの Entra ID アプリを許可する組織だけに制限します。

Userinfo と OAuth2 のツール群

GetUserInfo はプロフィールのJSONを返します。ループバックリダイレクトサーバー、リフレッシュトークン、DPoP、デバイスコード、失効、イントロスペクションは TsgcHTTP_OAuth2_Client から利用できます。

仕様・参考資料

このコンポーネントが実装する標準規格の公式ソースです。

ドキュメント・デモ

コンポーネントリファレンスへの直接リンク、すぐに実行できるデモプロジェクトの入手、体験版のダウンロードができます。

オンラインヘルプ — TsgcHTTP_OIDC_Client このコンポーネントのプロパティ、メソッド、イベントの完全なリファレンスです。
デモプロジェクト — Demos\26.Authentication\04.OpenID_Connect ディスカバリー、ブラウザサインイン、検証済みクレーム、userinfo、単独の JWT バリデーターを収録しています。sgcWebSockets パッケージに同梱されています。以下から体験版をダウンロードできます。
技術ドキュメント (PDF) このコンポーネントの機能、クイックスタート、Delphi および C++ Builder 向けのコードサンプル、一次資料のリファレンスを掲載しています。
ユーザーマニュアル (PDF) ライブラリのすべてのコンポーネントを網羅した総合マニュアルです。
ブログ — Delphi でパスキー、SAML SSO、LDAP、TOTP 2FA によるログインを実現する 6つの認証コンポーネントが1つの Delphi アプリケーションでどう連携するかを解説します。
最もお得な選択: All-AccesseSeGeCe の全製品にプレミアムサポートが付いて、年間 €1,059 からご利用いただけます。
All-Access の価格を見る

OpenID Connect によるサインインを追加しませんか?

体験版をダウンロードして、Delphi のユーザーをすでに信頼しているIDプロバイダーでサインインさせましょう。