Passkey・SAML SSO・LDAP・TOTP 2FA で実現する Delphi ログイン

· コンポーネント
Passkey・SAML SSO・LDAP・TOTP 2FA で実現する Delphi ログイン

ログイン画面は、業務アプリケーションの中で顧客全員が意見を持つ唯一の部分です。Entra ID アカウントでサインインできますか。パスキーに対応していますか。監査部門は二要素認証を求めています。ユーザーはすでに Active Directory にいるのに、なぜもう一つパスワードが必要なのですか。そして、アプリケーションが送信するメールは、Microsoft 365 が SMTP 設定のパスワードを拒否した日から動かなくなりました。

これらの問いはそれぞれ独自の仕様、独自の XML や ASN.1、そして「ほぼ正しい」ための独自の流儀を持つプロトコルです。新しいエンタープライズ認証コンポーネントは、これらに Delphi コンポーネントとして応えます。sgcWebSockets の Enterprise エディションと All-Access エディション、および sgcAuth パックに含まれており、同じコンポーネントは sgcWebSockets .NET の一部でもあります。

ユーザーが期待する形のパスキー

WebAuthn サーバーは、人々がパスキーと言うときに実際に意味する内容を、いまやカバーしています。

SAML シングルサインオン

大企業の顧客は、自社のスタッフが御社のアプリケーションにアカウントを持つことを望みません。会社がすでに運用している ID プロバイダーでサインインさせたいのです。TsgcSAMLServiceProvider は、御社のアプリケーションを Entra ID、Okta、AD FS、Google Workspace、Keycloak 向けの SAML 2.0 サービスプロバイダーにします。ID プロバイダーがログインを処理し、御社のアプリケーションはアサーションを受け取りますが、そのアサーションの署名は、ユーザー名を目にする前に検証されます。

Active Directory と LDAP ログイン

社内ネットワーク内で動作するアプリケーションの場合、ユーザーはすでにパスワード、つまり Windows のパスワードを持っています。TsgcLDAPClient は、LDAPS または StartTLS を介して Active Directory や任意の LDAP ディレクトリに対してユーザー名とパスワードを検証するため、パスワードが平文でネットワークを通過することはありません。SecurityldapsecLDAPS または ldapsecStartTLS に設定し、Authenticate を呼び出します。

ユーザーが誰であるかを知ることは、質問の半分にしか答えていません。GetUserGroups はネストされたグループを含め、そのアカウントが属するグループを返すため、“このユーザーは請求書の承認者か”という問いは、自分で書いてデバッグする再帰検索ではなく、一回の呼び出しで済みます。

認証アプリによる二要素認証コード

TsgcTOTPAuthenticator は、Google Authenticator、Microsoft Authenticator、その他あらゆる TOTP アプリの 6 桁コードを生成し、検証します。登録は、シークレットと QR コードとして表示する URI から成ります。サインインは一回の呼び出しです。

uses
  sgcAuth_TOTP, sgcBase_Helpers;

var
  oTOTP: TsgcTOTPAuthenticator;
  vSecret, vURI: string;
  vLastStep: Int64;
begin
  oTOTP := TsgcTOTPAuthenticator.Create(nil);
  try
    oTOTP.Issuer := 'MyApp';

    // enrolment: store vSecret with the user, show vURI as a QR code
    vSecret := oTOTP.GenerateSecret;
    vURI := oTOTP.GetProvisioningURI('john@example.com', vSecret);

    // sign-in: vLastStep is the last step accepted for this user, -1 the first time
    vLastStep := -1;
    if oTOTP.VerifyCode(vSecret, txtCode.Text,
      StrToInt64(GetDateTimeUnix(Now)), vLastStep) then
      ShowMessage('Signed in') // save vLastStep, this code is now spent
    else
      ShowMessage('Wrong, expired or already used');
  finally
    oTOTP.Free;
  end;
end;

このオーバーロードがリプレイ保護です。すでに受け入れられたコードは、自身の 30 秒以内であっても拒否されるため、誰かに肩越しに読まれたコードも、使われた後は無価値になります。電話を失くした日のために、GenerateRecoveryCodes は使い捨ての復旧コードのリストを生成します。パスワードと同じように保管してください。

OpenID Connect によるサインイン

TsgcHTTP_OIDC_Client は、任意の OpenID Connect プロバイダーでユーザーをサインインさせます。プロバイダーのディスカバリードキュメントを読み込むため、設定は手作業でコピーしたエンドポイントの一覧ではなく、発行者の URL とクライアント ID だけで済みます。受け取った ID トークンを検証し、同じ署名鍵で、御社自身の REST API に届くベアラートークンも検証します。これには、各顧客テナントが自身の発行者で署名する Entra ID のマルチテナントアプリケーションのトークンも含まれます。

Microsoft 365 と Gmail のメール向け OAuth2

Microsoft 365 と Gmail は、SMTP、IMAP、POP3 に対してパスワードではなく OAuth2 を要求します。TsgcMailOAuth2 はアクセストークンを取得し、更新し、SMTP、IMAP、POP3 セッションがサインインに使う XOAUTH2 文字列を組み立てます。プロバイダーとプロトコルを選び、クライアント ID を指定し、OnTokensChanged が発生したらリフレッシュトークンを保存してください。ブラウザのないサービスやコンソールアプリケーションは、代わりにデバイスコードフローを使用できます。

デモを試す

すべてのコンポーネントには、Demos\26.Authentication に実行可能なデモがあります。

ドキュメント

入手方法

これらのコンポーネントは、Delphi、C++ Builder、.NET 向け sgcWebSockets の Enterprise エディションと All-Access エディションに含まれています。認証機能だけが必要な場合は、sgcAuth パックで単体でも提供されています。これらは追加的なものです。フォームに一つ配置するまで、既存のアプリケーションで何も変わりません。

次に読む

動画で見る

“Delphi login with passkeys, SAML SSO, Active Directory LDAP and TOTP 2FA” というタイトルの短い動画eSeGeCe チャンネルにあります。

ご質問、フィードバック、またはログインページへの組み込みのサポートが必要ですか? お問い合わせください。コードを書いた本人から返信が届きます。