Delphi WebAuthn サーバー

Delphi サーバーにパスキーベースのパスワードレス認証を追加できます。WebAuthn Level 2 / FIDO2 の登録・認証セレモニー、アテステーション検証、認証情報ストレージフックを提供します。

TsgcWSAPIServer_WebAuthn

WebAuthn の RP(リライングパーティ)サーバーサイドを実装しています。認証情報チャレンジの生成、navigator.credentials レスポンスの検証、アテステーションステートメントの解析、アサーション署名の検証を行います。

コンポーネントクラス

TsgcWSAPIServer_WebAuthn

プロトコル

WebAuthn Level 2 (W3C)

対応プラットフォーム

Windows, macOS, Linux, iOS, Android

エディション

Enterprise

RP をマウントして認証情報を保存する

TsgcWebSocketHTTPServer 上に TsgcWSAPIServer_WebAuthn を配置し、WebAuthnOptions.RelyingParty を設定した後、OnWebAuthnRegistrationSuccessful で新しいパスキーを保存し、OnWebAuthnAuthenticationGetCredential でサインイン時に読み戻す処理を実装してください。

uses
  sgcWebSocket, sgcWebSocket_Server_APIs, sgcWebAuthn_Classes;

// Server: TsgcWebSocketHTTPServer と WebAuthn: TsgcWSAPIServer_WebAuthn はフォームフィールドです
procedure TForm1.StartServer;
begin
  Server := TsgcWebSocketHTTPServer.Create(nil);
  Server.Port := 8443;
  Server.SSL  := True;
  Server.SSLOptions.CertFile := 'server.pem';
  Server.SSLOptions.KeyFile  := 'server.pem';
  Server.SSLOptions.Port     := 8443;

  WebAuthn := TsgcWSAPIServer_WebAuthn.Create(nil);
  WebAuthn.Server := Server;
  WebAuthn.WebAuthnOptions.RelyingParty := 'example.com';
  WebAuthn.OnWebAuthnRegistrationSuccessful := OnRegistrationSuccessful;
  WebAuthn.OnWebAuthnAuthenticationGetCredential := OnGetCredential;

  Server.Active := True;
end;

procedure TForm1.OnRegistrationSuccessful(Sender: TObject;
  const aRegistration: TsgcWebAuthn_Registration;
  const aCredentialRecord: TsgcWebAuthn_CredentialRecord; var Accept: Boolean);
begin
  // 新しいパスキーを自前のデータベースに保存します
  SaveCredential(aCredentialRecord.CredentialId, aCredentialRecord.AsJSON);
end;

procedure TForm1.OnGetCredential(Sender: TObject; const aCredentialId: string;
  const aCredentialRecord: TsgcWebAuthn_CredentialRecord; var Found: Boolean);
var
  vJSON: string;
begin
  // サインイン時:保存済みのパスキーを読み戻します
  vJSON := LoadCredential(aCredentialId);
  Found := vJSON <> '';
  if Found then
    aCredentialRecord.ReadJSON(vJSON);
end;
// uses: sgcWebSocket, sgcWebSocket_Server_APIs
TsgcWebSocketHTTPServer *Server = new TsgcWebSocketHTTPServer(this);
TsgcWSAPIServer_WebAuthn *WebAuthn = new TsgcWSAPIServer_WebAuthn(this);
WebAuthn->Server = Server;
WebAuthn->WebAuthnOptions->RelyingParty = "example.com";
Server->Active = true;

主な機能

Delphi プロセスをパスキー対応の認証エンドポイントに変換する RP サーバーです。

登録セレモニー

OnWebAuthnRegistrationOptionsRequest が PublicKeyCredentialCreationOptions の要求を受け取り、ブラウザが navigator.credentials.create() を呼び出します。サーバーがアテステーションを検証し、OnWebAuthnRegistrationSuccessful が新しい認証情報レコードを返します。

認証セレモニー

OnWebAuthnAuthenticationOptionsRequest が保存済みの認証情報レコードで PublicKeyCredentialRequestOptions を満たし、サーバーが保存された公開鍵でアサーション署名を検証したうえで OnWebAuthnAuthenticationSuccessful を発生させます。

アテステーション解析

none、packed、fido-u2f、tpm、android-key、android-safetynet、apple のアテステーションステートメント形式をサポートしています。

カウンター検証

認証情報ごとの signCount を追跡してクローンされた認証器を検出します。カウンターが逆行した場合、OnWebAuthnAuthenticationError がエラーを報告します。

ユーザー検証

UserVerification はセレモニーごとに required、preferred、discouraged を設定でき、検証ステップでその設定が強制されます。

認証情報レコード

OnWebAuthnAuthenticationOptionsRequest がリクエストを渡すので、進行中のログイン向けに正しい CredentialRecords を allowCredentials リストとして返せます。ストレージの設計はご自由に行えます。

仕様・参考資料

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

ユーザーが期待するとおりのパスキー体験

パスキーは、Windows Hello、iCloud キーチェーン、Google パスワードマネージャー、またはセキュリティキーに保管されるディスカバラブルな WebAuthn 認証情報です。認証情報は自前のデータベースに保持したまま、パスキーの完全な体験をサーバーがサポートします。

ユーザー名なしサインイン

ユーザー名を指定せずに認証オプションを要求します。ブラウザがそのサイト用に保持しているパスキーの一覧を表示し、ユーザーが1つを選ぶと、サーバーが返された userHandle を確認します。

パスキーのオートフィル

条件付きメディエーションを使うと、パスキーがユーザー名フィールドのオートフィル一覧に表示されます。autocomplete="username webauthn" を追加し、/sgcWebAuthn.js の startAuthentication(options, true) を呼び出してください。

1ユーザーにつき複数のパスキー

ノートPCに1つ、スマートフォンにもう1つといった形でパスキーを登録できます。1つのアカウントのすべてのパスキーは同じユーザーハンドルを共有し、認証オプションにはそのすべてが列挙されます。

同期型とデバイス固定型

認証情報レコードの BackupEligible と BackupState により、同期型のパスキーとデバイス固定型のセキュリティキーを見分けられるため、デバイスを1台しか持たないユーザーに2つ目のパスキーを提案できます。

自前のデータベースを使用

OnWebAuthnRegistrationSuccessful でレコードを保存し、ユーザー名なしサインインやオートフィルサインインの認証情報は OnWebAuthnAuthenticationGetCredential で検索し、新しいカウンターは OnWebAuthnAuthenticationSuccessful で保存してください。

クローンされた認証器の検出

署名カウンターが前進しない場合はクローンの可能性があるとして拒否され、サインインのたびにバックアップ適格フラグが変化する場合も同様です。常に0を返す同期型パスキーは問題なく動作し続けます。

Delphi のパスキー:WebAuthn によるパスワードレスログインをお読みください。Passkeys ヘルプトピックもあわせてご覧ください。

ドキュメント・デモ

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

オンラインヘルプ — TsgcWSAPIServer_WebAuthn このコンポーネントのプロパティ、メソッド、イベントの完全なリファレンスです。
デモプロジェクト — Demos\20.HTTP_Protocol\12.WebAuthn すぐに実行できるサンプルプロジェクトです。sgcWebSockets パッケージに同梱されています。以下から体験版をダウンロードできます。
技術ドキュメント (PDF) このコンポーネントの機能、クイックスタート、Delphi および C++ Builder 向けのコードサンプル、一次資料のリファレンスを掲載しています。
ユーザーマニュアル (PDF) ライブラリのすべてのコンポーネントを網羅した総合マニュアルです。
最もお得な選択: All-AccesseSeGeCe の全製品にプレミアムサポートが付いて、年間 €1,059 からご利用いただけます。
All-Access の価格を見る

パスキー認証を追加しませんか?

体験版をダウンロードして、Delphi サーバーに WebAuthn / FIDO2 パスキーを導入してください。