新しいデバイスのセットアップ時にアプリの認証情報を復元する

認証情報マネージャーの [認証情報を復元] 機能を使用すると、新しいデバイスのセットアップ時にアプリのアカウントを復元できます。この API はデベロッパー プレビュー版であり、Android 9 以降と Google Play 開発者サービス(GMS)Core バージョン 242200000 以降を搭載したすべてのデバイスで利用できます。認証情報の復元機能のメリットは次のとおりです。

  • シームレスなユーザー エクスペリエンス: ユーザーは、個々のアプリに手動でログインすることなく、アプリのアカウントを復元できます。
  • ユーザー エンゲージメントの向上: 新しいデバイスのセットアップ時にアカウントを復元できる場合、ユーザーはアプリを使い続ける可能性が高くなります。
  • 開発作業の削減: 認証情報の復元機能は認証情報マネージャーと統合されているため、パスキーをすでにサポートしているデベロッパーは、認証情報の復元機能を追加できます。

仕組み

Restore Credentials を使用して、関連する認証情報を作成、取得、クリアできます。

  1. 復元認証情報を作成する: ユーザーがアプリにログインしたときに、アカウントに関連付けられた復元認証情報を作成します。この認証情報はローカルに保存され、ユーザーが Google バックアップを有効にしていて、エンドツーエンドの暗号化が利用可能な場合はクラウドに同期されます(アプリはクラウドへの同期をオプトアウトできます)。
  2. 復元認証情報を取得する: ユーザーが新しいデバイスを設定するときに、アプリは認証情報マネージャーから復元認証情報をリクエストできます。これにより、追加の入力を必要とせずにユーザーを自動的にログインさせることができます。
  3. 復元認証情報をクリアする: ユーザーがアプリからログアウトしたときに、関連付けられた復元認証情報を削除する必要があります。

認証情報の復元機能は、すでにパスキーを実装しているバックエンド システムとスムーズに統合できます。この互換性は、パスキーと復元キー(認証情報の復元機能で使用される認証情報のタイプ)の両方が同じ基盤となる技術仕様に準拠していることに由来します。この調整により、パスキー対応システムに保存されたユーザー認証情報を復元プロセスで効果的に取得して復元できるようになり、さまざまなプラットフォームや認証方法で一貫性のある使いやすいエクスペリエンスが提供されます。

認証情報マネージャーのボトムシート
図 1. 復元認証情報を使用してアプリデータを新しいデバイスに復元する様子を示す図。認証情報の作成、復元フローの開始、ユーザーの自動ログインが含まれます。

実装

Restore Credentials API は、Credential Manager Jetpack ライブラリを通じて利用できます。バックアップの手順:

  1. プロジェクトに Credential Manager の依存関係を追加します。

    // build.gradle.kts
    implementation("androidx.credentials:credentials:1.5.0-alpha03")
    
  2. CreateRestoreCredentialRequest オブジェクトを作成する。

  3. CredentialManager オブジェクトで createCredential() メソッドを呼び出します。

    val credentialManager = CredentialManager.create(context)
    
    // On a successful authentication create a Restore Key
    // Pass in the context and CreateRestoreCredentialRequest object
    val response = credentialManager.createCredential(context, createRestoreRequest)
    

    生成されたこの復元認証情報は WebAuthn 認証情報の一種で、復元キーと呼ばれます。

  4. ユーザーが新しいデバイスを設定するときに、CredentialManager オブジェクトの getCredential() メソッドを呼び出します。

    // Fetch the Authentication JSON from server
    val authenticationJson = fetchAuthenticationJson()
    
    // Create the GetRestoreCredentialRequest object
    val options = GetRestoreCredentialOption(authenticationJson)
    val getRequest = GetCredentialRequest(listOf(options))
    
    // The restore key can be fetched in two scenarios to
    // 1. On the first launch of app on the device, fetch the Restore Key
    // 2. In the onRestore callback (if the app implements the Backup Agent)
    val response = credentialManager.getCredential(context, getRequest)
    
  5. ユーザーがアプリからログアウトしたら、CredentialManager オブジェクトの clearCredentialState() メソッドを呼び出します。

    // Create a ClearCredentialStateRequest object
    val clearRequest = ClearCredentialStateRequest(TYPE_CLEAR_RESTORE_CREDENTIAL)
    
    // On user log-out, clear the restore key
    val response = credentialManager.clearCredentialState(clearRequest)
    

バックアップ エージェントを使用している場合は、onRestore コールバック内で getCredential 部分を実行します。これにより、アプリデータの復元直後にアプリの認証情報が復元されます。

よくある質問

Q1. 復元キーとパスキーの違いは何ですか?

復元キーはパスキーと同様の機能を提供しますが、新しいデバイスでのアカウントの復元専用に設計されています。Google パスワード マネージャーなどのパスワード管理ツールを使用して認証を行う場合、使用可能なパスキーとパスワードは表示されますが、復元キーは表示されません。復元キーは通常のログインを目的としたものではないためです。

Q2. 復元キーは 1 回限りの認証情報ですか?

いいえ。復元キーは 1 回限りの認証情報ではありません。Credential Manager はステートレスでユーザー アクティビティを認識しないため、使用後にキーを自動的に削除することはできません。

復元キーは、次の場合にのみ削除されます。

  • システムレベルのアクション: ユーザーがアプリをアンインストールするか、アプリのデータを消去します。
  • アプリレベルの呼び出し: アプリのコードでユーザーのログアウトを処理するときに、CredentialManager#clearCredentialState() を呼び出してキーをプログラムで削除します。

Q3. 認証情報の復元機能は新しいデバイスでのみ動作しますか?

はい。この機能は、新しい Android 搭載デバイスの初期設定を目的として設計されており、システムのバックアップと復元機能に直接関連付けられています。

Q4. 同じ Google アカウントでログインしているデバイスに、認証情報の復元を使用してユーザーをサイレント ログインさせることはできますか?

いいえ。認証情報の復元機能は、デバイス間の一般的なログインに使用することを想定していません。この機能は、ユーザーが古いデバイスのバックアップを復元して新しいデバイスをセットアップしている場合にのみ機能します。この 1 回限りの復元プロセスを成功させるには、両方のデバイスが同じ Google アカウントにリンクされている必要があります。

Q5. 組織に 1 つのメインアプリと複数のサブアプリがあります。1 つの復元キーでこれらのすべてのアプリを復元できますか?

いいえ。復元キーはアプリの一意のパッケージ名に関連付けられています。メインアプリと各サブアプリのパッケージ名は異なるため、アプリごとに個別の復元キーを作成する必要があります。

Q6. ユーザーのアカウントの復元キーを作成するにはパスキーが必要ですか?

いいえ、パスキーは必須ではありません。復元キーを作成する機能は、ユーザーのログイン方法とは無関係です。これは、ユーザーの現在の認証状態を保存することを目的としています。ユーザーがアプリにアクティブにログインしている限り、ユーザーの復元キーを生成できます。

Q7. ユーザーは復元キーを削除できますか?

いいえ、ユーザーは復元キーを直接制御できません。アプリのロジックは、復元キーの管理を担当します。

セキュリティのため、ユーザーがログアウトするたびにアプリがキーを自動的に削除することをおすすめします。これにより、次回同じデバイスでアプリを開いたときに、ユーザーが正しくログアウトされ、再度ログインを求められるようになります。

Q8. マニフェストで allowBackup を true に設定せずに、Restore Credentials を使用できますか?

はい。認証情報の復元機能は、allowBackup が true に設定されているかどうかに関係なく機能します。

Q9. 同じアプリに複数のアカウントでログインしているユーザーの場合、認証情報の復元はどのように機能しますか?

認証情報の復元機能は、一度に 1 つのアカウントでのみ動作するように設計されています。