Yappli Tech Blog

株式会社ヤプリの開発メンバーによるブログです。最新の技術情報からチーム・働き方に関するテーマまで、日々の熱い想いを持って発信していきます。

パスワードレス認証に移行してみた(Android Credential Manager)

Androidのパスワードレス認証と移行方法

2022年5月5日(世界パスワードデー)に、Apple、Google、Microsoftは共同でFIDOとW3Cをサポートし、汎用的なパスワードレスログイン標準の策定を発表しました。この発表により、パスワードの代わりに生体情報などの認証手段を使用したログインが普及し、セキュリティ上のリスクや詐欺の可能性を低減することが期待されています。

Androidでは、Credential Manager APIが提供されています。パスワードレス認証への移行方法としては、以下の2つの方法が考えられます:

  1. 生体情報との統合によるパスキー認証
  2. パスワードの保存と自動入力

ただし、パスキーの方式では、サーバー側にユーザーの公開鍵を保存する必要があるため、今回の記事では後者のアプリ側で完結する方法について紹介します。

パスワードの保存と自動入力

導入条件

  • Credential Manager APIを使用するには、Androidのバージョンが4.4(APIレベル19)以上である必要があります。
  • 利用可能なAPIバージョンは、使用しているAndroid SDKのバージョンによって異なります。詳細については、こちらを参照してください。

以下のようにAppモジュールのbuild.gradleにライブラリを追加します。

// SDK バージョン 33
dependencies {
    implementation "androidx.credentials:credentials:1.0.0-alpha09"
    implementation "androidx.credentials:credentials-play-services-auth:1.0.0-alpha09"
}

パスワードの保存

まず認証情報が正しいことを確認するため、従来のログインフローで確認します。問題がなければ、以下のように認証に使用した内容を保存します。

    private suspend fun savePassword(email: String, password: String): Boolean {
        try {
            val createPasswordRequest = CreatePasswordRequest(id = email, password = password)
            credentialManager.createCredential(
                request = createPasswordRequest,
                activity = this@Activity
            )
            return true
        } catch (e: CreateCredentialException) {
            Toast.makeText(this, "CreateCredentialException", Toast.LENGTH_SHORT).show()
        }
        return false
    }

保存ダイアログ

自動入力

保存後に再ログインする場合は、入力の代わりに保存した情報を使います。

    private suspend fun getCredential(): PasswordCredential? {
        val getPasswordOption = GetPasswordOption()
        val result = try {
            credentialManager.getCredential(
                activity = this@Activity,
                request = GetCredentialRequest(listOf(getPasswordOption))
            )
        } catch (e: Exception) {
            Toast.makeText(this, "Exception", Toast.LENGTH_SHORT).show()
            return null
        }
        return result.credential as? PasswordCredential
    }

これでログインの入力は必要がなくなります。

認証情報を選択

最後に

ビジネスの観点から、パスワードを使う場面が減少しますから、1Passwordのようなパスワード管理サービスはこの変化にどのように適応するかが注目されるところです。

また、このAPIはまだアルファ版の段階にあり、改善余地があるかと思います。例えば、Android Autofillという自動入力機能も提供されています。両方が同時に有効になっている場合、Credential Manager APIは衝突を回避するため、以下の例外が発生し、使用できなくなります。

16: Credentials API's save confirmation dialog has been disabled to avoid conflicts with the Android Autofill feature. This choice may be overridden via CredentialsOptions.

もし使用ケースに応じて、どちらを使用するかの決定権をユーザーに委ねば、もっと親切になると思いますので、これからの更新を期待しています。

今回の紹介は以上になります。ご覧いただき、ありがとうございました!