本文へ移動

ウォレットiframe

認証入力、Worker、署名状態、鍵のエクスポートを、分離したウォレットオリジンのiframe内に保持します。

ウォレットiframe ​

ウォレットiframeは、ブラウザーの分離境界です。アプリとは別のウォレットオリジンで実行します。 ウォレットUI、暗号化したローカルレコード、Worker、ウォレットオリジンのセッション状態を管理します。

境界 ​

境界役割
アプリオリジンSDKを呼び、アプリUIを表示し、公開操作の入力を渡す。
ウォレットiframeのオリジンウォレットUI、IndexedDB、認証方法のフロー、Workerを管理する。
ブラウザーWorker使用中の保持者素材と、操作内の秘密状態を管理する。

アプリオリジンのJavaScriptは、公開結果と秘密を含まないフロー状態を受け取ります。 保持者シェア、PRF出力、メールOTP秘密素材、VoiceIDテンプレート、サーバーシェアは、アプリオリジンの外に留まります。 承認済みの鍵エクスポートは、ウォレットオリジンのビューアー内に素材を表示します。 keys.exportKeyは、アプリへ操作結果を返します。秘密鍵は返しません。

公開済みSDKでは、WebAuthnの認証情報作成とアサーションをウォレットオリジンで実行します。 SDKは、iframeの権限をそのオリジンへ委譲します。アプリオリジンのWebAuthnへ切り替える経路はありません。 対応ブラウザーと、ウォレットオリジンに適合するRP IDを使ってください。

分離する理由 ​

iframeは、ウォレットの権限をアプリページから独立させます。 アプリページが侵害されても、ウォレットオリジンの確認、ポリシー、認証要件を満たす必要があります。 署名レーンの参加前に、セッションの受付、リプレイ、署名利用枠の確認にも成功する必要があります。

境界を設定する ​

Reactプロバイダーのマウント時に、ウォレットオリジンを明示します。 ウォレットサービスとSDKのパスは、その専用オリジンを基準に解決します。

実行可能なReactの実装例
tsx
import { SeamsWebProvider, seamsTestnetConfig, useSeams } from '@seams/wallet/react';

// Everything else — wallet service path, SDK base path, relayer account, chain
// RPC and explorer URLs — comes from the SDK defaults.
const seamsConfig = seamsTestnetConfig({
  walletOrigin: import.meta.env.VITE_WALLET_ORIGIN,
  relayerUrl: import.meta.env.VITE_RELAYER_URL,
  publishableKey: import.meta.env.VITE_SEAMS_PUBLISHABLE_KEY,
});

function WalletApp() {
  const { loginState } = useSeams();
  return <p>{loginState.isLoggedIn ? 'Wallet unlocked' : 'Wallet locked'}</p>;
}

export function App() {
  return (
    <SeamsWebProvider config={seamsConfig}>
      <WalletApp />
    </SeamsWebProvider>
  );
}