パスワードで認証する

認証情報マネージャーはパスワード ベースのログインをサポートしていますが、パスキーGoogle でログインなどの最新の安全な認証方法を優先することを強くおすすめします。これらの方法は、セキュリティとユーザー エクスペリエンスを大幅に向上させます。ただし、アプリでパスワードをサポートする必要がある場合は、このガイドを参照して、認証情報マネージャーでパスワードを実装してください。

認証情報マネージャーは、ユーザー名やパスワードなどのユーザー認証情報をアプリで保存、取得するための統合 API を提供します。これにより、ユーザーのログイン プロセスが簡素化され、ユーザーは認証情報プロバイダをシームレスに利用できるようになります。

前提条件

Credential Manager のパスワードの実装は、Android 4.4(API レベル 19)以降を搭載したデバイスで動作します。

概要

このガイドでは、パスワードの作成、保存、ログインを行うためにアプリに必要な変更について説明します。

  • アプリに依存関係を追加する: 必要な認証情報マネージャー ライブラリを追加します。
  • 認証情報マネージャーをインスタンス化する: 認証情報マネージャーのインスタンスを作成します。
  • ユーザーのパスワードを保存する: ユーザー認証情報を安全に保存します。
  • パスワードでログイン: 保存された認証情報を取得してログインに使用します。
  • 自動入力を使用するフィールドを特定する: 自動入力を使用してユーザー エクスペリエンスを向上させます。
  • デジタル アセット リンクのサポートを追加する: リンクされたアプリとウェブサイト間でパスワードを共有するサポートを追加します。

アプリに依存関係を追加する

アプリ モジュールの build.gradle ファイルに次の依存関係を追加します。

Kotlin

dependencies {
    implementation("androidx.credentials:credentials:1.7.0-alpha02")
}

Groovy

dependencies {
    implementation "androidx.credentials:credentials:1.7.0-alpha02"
}

認証情報マネージャーをインスタンス化する

アプリまたはアクティビティのコンテキストを使用して CredentialManager オブジェクトを作成します。

// Use your app or activity context to instantiate a client instance of
// CredentialManager.
private val credentialManager = CredentialManager.create(context)

ユーザーのパスワードを保存する

ユーザーがアプリ内で登録またはパスワードの更新に成功したら、これらの認証情報をパスワード マネージャーに保存します。

  1. パスワード リクエストを構築する: CreatePasswordRequest オブジェクトには、保存するユーザー名とパスワードが含まれます。credentialManager.createCredential() を呼び出して保存プロセスを開始します。

  2. レスポンスを処理する: CreatePasswordResponse を処理し、エラーを管理します(ユーザーがリクエストをキャンセルした場合など)。

suspend fun registerPassword(username: String, password: String) {
    // Initialize a CreatePasswordRequest object.
    val createPasswordRequest =
        CreatePasswordRequest(id = username, password = password)

    // Create credential and handle result.
    coroutineScope {
        try {
            val result =
                credentialManager.createCredential(
                    // Use an activity based context to avoid undefined
                    // system UI launching behavior.
                    activityContext,
                    createPasswordRequest
                )
            // Handle register password result
        } catch (e: CreateCredentialException) {
            handleFailure(e)
        }
    }
}

パスワードでログインする

保存された認証情報を取得するには、GetPasswordOption を使用して GetCredentialRequest を作成し、getCredential() を呼び出します。指定されたユーザー ID に基づいて取得するパスワードをフィルタするには、省略可能なフィールド allowedUserIds を使用します。

val getPasswordOption = GetPasswordOption()

val credentialRequest = GetCredentialRequest.Builder()
    .addCredentialOption(getPasswordOption)
    .build()

自動入力を使用するフィールドを特定する

android:isCredential 属性は、認証情報プロバイダが自動入力用のフィールドを特定するのに役立ち、ユーザー エクスペリエンスの向上につながります。この属性は、既存の autofillHints を補完します。

特定のフィールドを自動入力の対象として指定するメリットは次のとおりです。

  • 自動入力の精度を向上: パスワード マネージャーと Android システムが、認証情報用のフィールドをより正確に特定できるようになります。
  • ユーザー エクスペリエンスの向上: よりスムーズで信頼性の高い自動入力候補につながります。

次の例に示すように、ユーザー名とパスワードのフィールドに isCredential 属性を含めます。

<EditText
    android:id="@+id/username_edittext"
    android:autofillHints="username"
    android:isCredential="true" />

<EditText
    android:id="@+id/password_edittext"
    android:inputType="textPassword"
    android:autofillHints="password"
    android:isCredential="true" />

または、次のスニペットに示すように、プログラムで属性を追加します。

if (android.os.Build.VERSION.SDK_INT >=
    android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { // Android 14
    usernameEditText.isCredential = true
    passwordEditText.isCredential = true
}

パスワード マネージャーとの互換性を確保するには、アプリとウェブサイトの間に Digital Asset Links を構成する必要があります。これにより、両方のプラットフォーム間で認証情報を安全に共有できます。