メールOTP
メールOTPは、ワンタイムパスワードでメールアドレスへのアクセスを確認します。 サーバーがチャレンジを検証し、専用Workerが秘密素材を扱います。
モデル内の役割
メールOTPは、次の処理に使えます。
- 検証済みメール経路の管理権を証明する。
- Workerが管理するメールOTP秘密情報の再構成を承認する。
- ウォレットセッションのポリシーに従い、署名機能を作成または復元する。
- 消費済みや期限切れのメールOTPのウォレットセッション利用枠を、追加認証で更新する。
- 新たな操作固有のポリシーを通じてのみ、エクスポートや復元を承認する。
秘密を含むメール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;
}