本文へ移動

メールOTP

サーバーが検証するメールOTPチャレンジを使い、復元と署名の秘密情報をウォレットの境界内に保持します。

メールOTP ​

メールOTPは、ワンタイムパスワードでメールアドレスへのアクセスを確認します。 サーバーがチャレンジを検証し、専用Workerが秘密素材を扱います。

モデル内の役割 ​

メールOTPは、次の処理に使えます。

  1. 検証済みメール経路の管理権を証明する。
  2. Workerが管理するメールOTP秘密情報の再構成を承認する。
  3. ウォレットセッションのポリシーに従い、署名機能を作成または復元する。
  4. 消費済みや期限切れのメールOTPのウォレットセッション利用枠を、追加認証で更新する。
  5. 新たな操作固有のポリシーを通じてのみ、エクスポートや復元を承認する。

秘密を含むメールOTP素材は、専用Workerか暗号化ストレージに置きます。 アプリオリジンのコードに、復元したメールOTP秘密情報や導出した署名シェアを渡さないでください。

ログインを開始する ​

Google IDトークンを、型付きのログインフローへ交換します。その後、ユーザーが入力したコードを送信します。 登録の分岐には、独自のウォレット選択と復元コードのバックアップ手順があるため、別に処理します。

実行可能なTypeScriptの実装例
ts
import type {
  GoogleEmailOtpWalletAuthLoginFlow,
  GoogleEmailOtpWalletAuthSubmitSuccess,
  SeamsWeb,
} from '@seams/wallet';

export async function startGoogleEmailOtpLogin(
  seams: SeamsWeb,
  googleIdToken: string,
): Promise<GoogleEmailOtpWalletAuthLoginFlow> {
  const started = await seams.auth.startGoogleSignIn({
    idToken: googleIdToken,
    mode: 'login',
    loginTarget: { kind: 'discoverable' },
  });
  if (!started.ok) {
    throw new Error(started.error.message);
  }
  if (started.value.mode !== 'login') {
    await started.value.cancel();
    throw new Error('This Google account needs wallet registration');
  }
  return started.value;
}

export async function submitGoogleEmailOtp(
  flow: GoogleEmailOtpWalletAuthLoginFlow,
  otpCode: string,
): Promise<GoogleEmailOtpWalletAuthSubmitSuccess> {
  const submitted = await flow.submit({ otpCode });
  if (!submitted.ok) {
    throw new Error(submitted.error.message);
  }
  return submitted.value;
}