本文へ移動

ホスト環境への導入

専用HTTPSウォレットオリジンからSeamsのウォレットサービスとSDKアセットを配信し、許可したアプリオリジンを接続します。

ホスト環境への導入 ​

製品のアプリは、@seams/walletをインポートします。 専用のウォレットオリジンは、分離したiframeが使うウォレットサービス、SDK補助アセット、Worker、エクスポートビューアーを配信します。

必要なルート ​

ウォレットサービスを設定済みのwalletServicePathへ、ランタイムアセットをsdkBasePathへデプロイします。 アセットのContent-Typeを維持してください。名前にコンテンツハッシュを含む不変ファイルはキャッシュします。 古いHTMLが古いランタイムマニフェストを選ばないようにしてください。

アプリには、絶対HTTPS URLのウォレットオリジンを設定します。 アプリのオリジン経由でウォレットのルートをプロキシしたり、ランタイムアセットの複製を配信したりしないでください。

ホストするメニューで登録を準備する ​

パスキーボタンを選ぶ前に準備を開始するには、登録にHostedSeamsAuthMenuを使います。 登録画面が開いている間に、対象ウォレット、署名機能の選択、パスキーのチャレンジを準備します。 パスキーボタンは、その準備を利用します。メニューを閉じると、ローカルの準備をキャンセルします。 期限切れの準備から、認証情報の要求を開始することはできません。

tsx
import {
  HostedSeamsAuthMenu,
  useSeams,
  type HostedAuthMenuOutcome,
} from '@seams/wallet/react';

export function HostedRegistration({ onOutcome }: {
  onOutcome: (outcome: HostedAuthMenuOutcome) => void;
}) {
  return <HostedSeamsAuthMenu initialMode="register" onOutcome={onOutcome} />;
}

export function SignInIntentButton({ onOpen }: { onOpen: () => void }) {
  const { seams } = useSeams();
  return (
    <button
      onPointerEnter={seams.authMenu.prepare}
      onFocus={seams.authMenu.prepare}
      onTouchStart={seams.authMenu.prepare}
      onClick={onOpen}
    >
      Sign in
    </button>
  );
}

SeamsWebProvider内にHostedRegistrationを表示してください。アプリ用の結果ハンドラーを指定します。 SignInIntentButtonは、操作の予兆でコードをダウンロードし、クリック時にonOpenを呼びます。 そのハンドラーで、ホストする認証メニューをマウントします。

authMenu.prepare()は、サインイン用コードをダウンロードします。 ウォレットの予約や登録チャレンジの準備は、登録画面が開始します。 registration.registerWallet()を直接呼ぶ場合は、その呼び出し内でパスキーの入力前に準備を開始します。 独立した公開の準備ハンドルはありません。

ホストするGatewayは、任意のペア準備をwaitUntilで実行します。 準備の応答前に、ウォレットのオブジェクトアドレスを永続化します。 ペア準備はパスキーの入力と並行できますが、Yaoの実行には検証済みのパスキー証明が必要です。 任意の準備が失敗したり期限切れになったりしても、通常の実行経路で復旧できます。

事前準備がパスキー選択後の待ち時間を減らすのは、メニューが十分長く開いていた場合だけです。 サーバーの総処理量は減りません。

リリースの確認 ​

  • ウォレットサービスを直接開き、期待するリリース識別情報を確認する。
  • 許可したアプリオリジンから登録とアンロックを行う。
  • 一覧にないオリジンが拒否されることを確認する。
  • 署名の確認、キャンセル、再試行可能な失敗を各1回実行する。
  • 本番のCSPでWorkerとWASMが読み込めることを確認する。
  • エクスポート内容が、ウォレットオリジンのビューアー内に留まることを確認する。

公開アセットの@seams/wallet/web/wallet-iframe-client-htmlは、対応するホスト型ウォレットのビルド経路だけで使ってください。 パッケージのコードとホストするアセットを、互換性のある同じリリースに揃えてください。

リリース 0.42.0 ​

@seams/walletと@seams/wallet-serverを0.42.0に固定してください。 @seams/wallet-cliも0.29.0を使用します。署名済みネイティブアセットは復元CLIのガイドを参照してください。 VoiceIDをホストする場合は、@seams/voiceid 0.42.0もインストールします。 npx --no-install seams-voiceid-host ./wallet-with-voiceidで静的デプロイ用のディレクトリーを作成してください。 アプリとホストの手順は、VoiceIDの設定を参照してください。 対応する導入方法は、リリース 0.42.0を参照してください。

APACのウォレットオブジェクトは、apac-seで東南アジアへの配置を要求します。 ホスト環境を受け入れる前に、実際のオブジェクトとデータベースの配置を確認してください。 Consoleの移動処理も、同じ配置ヒントを使う必要があります。

期限切れの初期テナント承認を更新できるのは、作成ジャーナルの開始前だけです。 Consoleが代替承認を発行する前に、Routerは永続的なフェンスを記録します。 フェンスは、期限切れ承認による遅延リクエストを遮断します。 開始済みの手順は、復旧用に元の承認をそのまま保持します。 対応するウォレットホスト、Gateway、Wallet Runtime、Router、コントロールプレーン、両Deriver、Signing Workerをデプロイしてください。 非公開のアドレス割り当て応答はバッチを含むため、鍵管理Workerは一緒に更新する必要があります。 アプリとウォレットホストは、どちらも公開iframeプロトコル23.0.0を使います。

登録は確定済みの受付を再利用し、完了記録とともに鍵管理を確定します。 Bの準備応答を待たず、検証済みのAの完了後に終了できます。 ホスト環境での有効化は、応答後に不要となった手順のクリーンアップも実行します。 これらの変更は、証明、鍵管理、リプレイの確認を維持します。

登録の完了 ​

新しいGatewayが処理を開始する前に、D1マイグレーション0081_registration_directory_publications.sqlを適用してください。 ディレクトリーが未確認の登録完了を保持するテーブルを追加します。

登録の応答は、完了情報のディレクトリー書き込みを待ちません。 Gatewayは1つのローカルトランザクションで、ウォレットの有効化と完了の保留記録を行い、応答後に完了情報を送ります。 署名は直ちに利用できます。書き込みが失敗すると、定期ハンドラーが同じセッションダイジェストと有効期限を、確認されるまで再送します。 独自の登録権限サービスでGatewayを構成する場合は、定期ハンドラーで@seams/wallet-server/cloud-hostのresumeRegistrationDirectoryPublicationsV1を呼んでください。 例えば、1分ごとに実行します。同梱のローカルGateway Workerは、この処理を実行します。

ディレクトリーの確認まで、通常は1秒以内ですが、ウォレットはConsoleの一覧に現れず、別リージョンへ移動できません。 登録直後に一覧を読むバックエンドでは、その間、新しいウォレットを取得できない場合があります。

リージョン別のルーティング ​

リージョン別のデプロイでは、登録時に各ウォレットへホームリージョンを割り当てます。 共有ディレクトリーは、リンク済みデバイスや移動中のユーザーを含め、その後のライフサイクル・署名リクエストをホームへ送ります。 ホームが変わるのは、所有者が別のリージョンへ移動した場合だけです。 同じプロジェクトのウォレットでも、異なるホームを持てます。 ウォレットごとのホームリージョンを参照してください。

アプリは、プロジェクトに設定したGateway URLを使います。 D1データベースの選択や、署名ごとのリージョン指定は行いません。 運用者はホームを受け入れる前に、リージョン別Workerのバインディング、D1のプライマリー提供リージョン、DO・Containerの配置を確認します。 ディレクトリーが失敗した場合は、操作を利用不能として報告する必要があります。別リージョンでの書き込みを許可できません。