メインコンテンツまでスキップ

ZTXBAS チャレンジのライフサイクル

認証処理は短い状態遷移に従います。予期しない応答を調査する際に、この仕組みを理解しておくと役立ちます。

状態​

approved(承認)、denied(拒否)、expired(期限切れ)は最終状態です。いずれかに移行すると、スイーパーがデータを削除するまでポーリング結果は変わりません。

時間に関する設定​

パラメーター値備考
チャレンジ有効期限5 分作成から expired まで
JWT の有効期間5 分発行から exp まで
SDK の JWKS キャッシュ5 分鍵情報の再取得間隔
時刻ずれ許容HMAC ±5 分 / JWT ±30 秒RP 側の検証

チャレンジの有効期限が 5 分であるため、poll_challenge の既定タイムアウトは 4 分 30 秒です。サーバーが expired を返す前に ChallengeTimeoutError として処理できます。

シークレットのローテーションの影響​

アプリの HMAC シークレットをローテーションしても、すでに進行中のチャレンジは無効になりません。チャレンジは ID、オリジン、ユーザーに結び付いています。新しいシークレットの展開中は一時的に INVALID_SIGNATURE が発生することがありますが、既存チャレンジの状態は維持されます。

冪等性と安全性​

  • チャレンジ作成は冪等ではありません。 連続実行すると端末へ 2 回通知されます。ログインボタンの多重クリックは RP 側で抑止してください。
  • 状態ポーリングは冪等で、メモリ上のストアに対するインデックス検索です。
  • 承認は 1 回限り。 最初の承認で approved に移行し、以後のタップは無視されます。

よくある失敗と原因​

症状可能性の高い原因
create_challenge が 404このアプリのテナントにユーザーが未登録
create_challenge が 403 UNREGISTERED_ORIGIN/v1/origins に対象オリジンが未登録
pending が続き、その後 expiredプッシュが端末に到達していない(ネット接続、通知設定等)
INVALID_SIGNATURE がチャレンジ作成でのみ発生RP と ZTXBAS のシークレット不一致
全呼び出しで TIMESTAMP_EXPIREDRP ホストの時刻ずれ。NTP を確認

関連資料​