Skip to content

Add Operation.RestoreCredential for Android Restore Credentials support - #20

Open
ritou wants to merge 1 commit into
masterfrom
work/add-restore-credentials
Open

ritou wants to merge 1 commit into
masterfrom
work/add-restore-credentials

Conversation

@ritou

@ritou ritou commented Oct 3, 2026

Copy link
Copy Markdown
Owner

概要

Android の Credential Manager API における Restore Credentials のサーバー側検証を行う新モジュール WebAuthnLite.Operation.RestoreCredential を追加します。

Google Play Store は 2027年4月 からサインイン機能を持つアプリに Restore Credentials 対応を必須化する予定です。

通常の Operation.Authenticate との違い

項目 Authenticate RestoreCredential
clientDataJSON.type デフォルト "webauthn.get" "webauthn.get"(type で上書き可能)
origin 形式 https://... android:apk-key-hash:<Base64URL(SHA-256)>
UP フラグ検証 up_required up_required(false 推奨)
BE フラグ検証 なし be_required オプションで追加可能
BS フラグ検証 なし bs_required オプションで追加可能

新機能

validate_client_data_json/1

  • type オプションで期待する clientDataJSON の type を設定可能(デフォルト: "webauthn.get")
  • Android APK 署名ハッシュ形式の origin に対応

validate_authenticator_assertion/1

  • be_required: true — BE (Backup Eligible) フラグを必須に設定可能
  • bs_required: true — BS (Backup State) フラグを必須に設定可能
  • UP フラグ不要(up_required: false)でも検証可能(バックグラウンド実行対応)

使用例

# clientDataJSON の検証
{:ok, client_data_json} =
  WebAuthnLite.Operation.RestoreCredential.validate_client_data_json(%{
    client_data_json: encoded_client_data_json,
    origin: "android:apk-key-hash:sjYxqUM11Op8oHJuOdbrsCqtvYvbKHhQoKBlt28dLec",
    challenge: challenge
  })

# アサーション検証(UP 不要、BE/BS 必須)
{:ok, updated_key, auth_data} =
  WebAuthnLite.Operation.RestoreCredential.validate_authenticator_assertion(%{
    credential_id: credential_id,
    signature: encoded_signature,
    authenticator_data: encoded_authenticator_data,
    client_data_json: encoded_client_data_json,
    public_keys: [storable_public_key],
    rp_id: rp_id,
    up_required: false,
    uv_required: false,
    be_required: true,
    bs_required: true
  })

実装上の注意点

  • origin: リリース用とデバッグ用の APK 署名証明書でハッシュが異なるため、アプリ側で複数 origin を OR 条件で管理する
  • DB 管理: Restore Credentials はプロトコルレベルでは通常パスキーと区別できないため、credential_type = 'restore_key' などで管理を推奨。ユーザー向けパスキー管理 UI には非表示にすること
  • AAGUID: 全ゼロ(00000000-0000-0000-0000-000000000000)になるため、AAGUID で識別可能

テスト

  • validate_client_data_json — 5ケース(type / origin / challenge のバリデーション)
  • validate_authenticator_assertion — 5ケース(BE/BS フラグ検証、署名エラー、RP ID エラーなど)

参考

🤖 Generated with Claude Code

Android の Credential Manager API における Restore Credentials のサーバー側
検証を行う新モジュール WebAuthnLite.Operation.RestoreCredential を追加する。

通常の Operation.Authenticate との主な違い:
- UP/UV フラグを要求しないオプション(バックグラウンド実行対応)
- BE (Backup Eligible) / BS (Backup State) フラグの検証オプションを追加
- origin に android:apk-key-hash:... 形式を使用
- clientDataJSON の type が設定可能(デフォルト "webauthn.get")

Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant