Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Google Sign-inの移行から始めるCredential Manager活用

clockvoid
September 13, 2024

Google Sign-inの移行から始めるCredential Manager活用

DroidKaigi 2024での登壇資料です。

Google Sign-In for AndroidのDeprecatedに伴い、Google Play Services Auth SDKとCredential Managerについての基礎的な知識を抑え、更には具体的な移行方法まで解説しています

登壇動画はこちら:https://www.youtube.com/watch?v=zyC2jt2b7aU

clockvoid

September 13, 2024
Tweet

Other Decks in Programming

Transcript

  1. Google Sign-in Google Sign-In for Android is deprecated and will

    be removed from the Google Play Services Auth SDK. (com.google.android.gms:play-services- auth) in 2025. For authentication, developers should migrate their Android projects to Credential Manager. For authorization actions that need access to user data stored by Google such as Google Drive, use the AuthorizationClient API.1 1https://developer.android.com/identity/sign-in/legacy-gsi-migration 4
  2. Google Sign-in Google Sign-in for Androidは、現在非推奨となっており、 2025年にGoogle Play Services Auth

    SDK から削除される予定です。 認証で使用するためには、開発者は Credential Manager に移行する必要が あります。 Google のサービスに保存されているユーザデータにアクセスするための認 可がほしい場合は、 AuthorizationClient API を使用してください。 5
  3. Google Sign-in Google Sign-in for Androidは、現在非推奨となっており、 2025年にGoogle Play Services Auth

    SDK から削除される予定です。 認証用途で使用するためには、開発者は Credential Manager に移行する必 要があります。 Google のサービスに保存されているユーザデータにアクセスするための認 可がほしい場合は、 AuthorizationClient API を使用してください。 6
  4. 本発表の構成 ①基礎的な部分についての説明 Google Play services 概要 Auth SDK について Credential

    Manager 概要 仕組みと使い方 ② Google Sign-In の移行 Legacy な Google Sign-In の組み 込み方についておさらい Credential Manager での実装 方法 7
  5. Google Play services Google Play services が提供する機能を使っている SDK の例12 AdMob

    Analytics Cast Fit Firebase Pay Sign-in Location Maps ML Kit Nearby Games 1https://developers.google.com/android 2These services are trademarks of Google LLC. 9
  6. Google Play services クライアントライブラリ クライアントライブラリは、 Google Play services と IPC

    で通信をすること で、 Google Play sevices の機能を呼び出している App Google Play services Client library B Client library A IPC 11
  7. Google Play services Google Play Services Auth SDK Google Play

    services のクライアントライブラリの一つ Maven Artifact は com.google.android.gms:play-services-auth 提供している Google Sign-in 関係の API は 2 つ Google Sign-In for Android (auth.api.signin) Google Identity Services (auth.api.identity) 12
  8. Google Play services Google Sign-In for Android の機能 Sign in

    with Google Google のデータにアクセスするための認可プ ロセスの提供 13
  9. Google Play services Google Sign-In for Android の機能 Sign in

    with Google Google のデータにアクセスするための認可プ ロセスの提供 →現在は Deprecated で、 2025 年に削除される 予定 13
  10. Google Play services Google Identity Services の Interface 1. SignInClient

    1.1 Sign in with Google 1.2 One Tap sign-in 1.3 Phone Number Hint 2. CredentialSavingClient 2.1 パスワードの保存 2.2 Account Linking で使用される Token の保存 3. AuthorizationClient 3.1 Google の data にアクセスするための認可プ ロセスの提供 14
  11. Google Play services Google Identity Services の Interface 1. SignInClient

    1.1 Sign in with Google 1.2 One Tap sign-in 1.3 Phone Number Hint 2. CredentialSavingClient 2.1 パスワードの保存 2.2 Account Linking で使用される Token の保存 3. AuthorizationClient 3.1 Google の data にアクセスするための認可プ ロセスの提供 14
  12. Google Play services Google Identity Services の Interface 1. SignInClient

    1.1 Sign in with Google 1.2 One Tap sign-in 1.3 Phone Number Hint 2. CredentialSavingClient 2.1 パスワードの保存 2.2 Account Linking で使用される Token の保存 3. AuthorizationClient 3.1 Google の data にアクセスするための認可プ ロセスの提供 14
  13. Google Play services Google Identity Services の Interface 1. SignInClient

    1.1 Sign in with Google 1.2 One Tap sign-in 1.3 Phone Number Hint 2. CredentialSavingClient 2.1 パスワードの保存 2.2 Account Linking で使用される Token の保存 3. AuthorizationClient 3.1 Google の data にアクセスするための認可プ ロセスの提供 14
  14. Google play sevices Google Identity Services の Interface 1. SignInClient

    1.1 Sign in with Google 1.2 One Tap sign-in 1.3 Phone Number Hint 2. CredentialSavingClient 2.1 パスワードの保存 2.2 Account Linking で使用される Token の保存 3. AuthorizationClient 3.1 Google の data にアクセスするための認可プロセスの提供 →ハイライトしている、 1.1, 1.2, 2.1 は Deprecated 14
  15. Credential Manager 詳細 Credential Manager の内部構造 Jetpack の credentials というライブラリが

    API を提供 Android 14 以上と Android 13 以下で、動きが異なる Android 14 Android 12 17
  16. Credential Manager 詳細 Android 14 以上での Credential Manager CredentialManager という名前のネイティブ

    API が Android 14 で導入された Jetpack の credentials ライブラリが、ネイティブ API を呼び出すようになって いる Note that an application should call the Jetpack CredentialManager apis instead of directly calling these framework apis.3 3https: //developer.android.com/reference/android/credentials/CredentialManager 18
  17. Credential Manager 詳細 Android 14 以上での Credential Manager CredentialManager という名前のネイティブ

    API が Android 14 で導入された Jetpack の credentials ライブラリが、ネイティブ API を呼び出すようになって いる Note that an application should call the Jetpack CredentialManager apis instead of directly calling these framework apis.3 Android system が、 credential provider として動作するアプリとやり取りをす ることで認証情報の取得や保存を行う ユーザから見ると、対応しているアプリをインストールするだけで Credential Manager のダイアログに表示される認証情報の選択肢が増える 3https: //developer.android.com/reference/android/credentials/CredentialManager 18
  18. Credential Manager 詳細 Credential provider として動作するアプリの実装4 API 34 から導入された、 CredentialProviderService

    という Service ク ラスの実装を用意 4https://developer.android.com/identity/sign-in/credential-provider 19
  19. Credential Manager 詳細 Credential provider として動作するアプリの実装4 API 34 から導入された、 CredentialProviderService

    という Service ク ラスの実装を用意 AndroidManifest.xml に Service クラスを登録する際、 intent filter と permission を設定 intent filter は android.service.credentials.CredentialProviderService permission は BIND_CREDENTIAL_PROVIDER_SERVICE 4https://developer.android.com/identity/sign-in/credential-provider 19
  20. Credential Manager 詳細 Credential provider として動作するアプリの実装4 API 34 から導入された、 CredentialProviderService

    という Service ク ラスの実装を用意 AndroidManifest.xml に Service クラスを登録する際、 intent filter と permission を設定 intent filter は android.service.credentials.CredentialProviderService permission は BIND_CREDENTIAL_PROVIDER_SERVICE Android system が Credential Manager の使用を検知すると、 Service クラスに 実装した bind 関数が呼び出される 4https://developer.android.com/identity/sign-in/credential-provider 19
  21. Credential Manager 詳細 Android 13 以下での Credential Manager Android 13

    以下では、 Jetpack の credentials-play-services-auth というライ ブラリが Google Play services の機能を使って Credential を取り扱う 20
  22. Credential Manager 詳細 Android 13 以下での Credential Manager Android 13

    以下では、 Jetpack の credentials-play-services-auth というライ ブラリが Google Play services の機能を使って Credential を取り扱う Google パスワードマネージャは、 Google Play services の一部として提供され ている パスワードと passkey を取り扱う passkey は Android 9 以降でのみ使用可能 20
  23. Credential Manager 詳細 Android 13 以下での Credential Manager Android 13

    以下では、 Jetpack の credentials-play-services-auth というライ ブラリが Google Play services の機能を使って Credential を取り扱う Google パスワードマネージャは、 Google Play services の一部として提供され ている パスワードと passkey を取り扱う passkey は Android 9 以降でのみ使用可能 同じライブラリが Google Sign-in 対応もしてくれている 20
  24. Credential Manager 詳細 Android 13 以下での Credential Manager Android 13

    以下では、 Jetpack の credentials-play-services-auth というライ ブラリが Google Play services の機能を使って Credential を取り扱う Google パスワードマネージャは、 Google Play services の一部として提供され ている パスワードと passkey を取り扱う passkey は Android 9 以降でのみ使用可能 同じライブラリが Google Sign-in 対応もしてくれている credentials-play-services-auth でなくても、 CredentialProvider という インターフェースの実装を提供するライブラリを利用することで、好みのパス ワードマネージャを利用できる実装にはなっている ただし、アプリに含めることができるカスタムの CredentialProvider 実装は 1 つだけ 20
  25. Credential Manager 詳細 Credential Manager の OS バージョンごとの対応機能 機能 15

    以降 14 13 以前 Integrate with Auto fill CredentialProviderService TextView の isCredential attribute prepareGetCredential passkey 認証 5 パスワード認証 Google Sign-in 5Android 9 以降 21
  26. Credential Manager 詳細 認証情報の取得 1 val credentialManager = CredentialManager.getInstance(context) 2

    val getCredentialOption = // create GetCredentialOption suitable for authentication method 23
  27. Credential Manager 詳細 認証情報の取得 1 val credentialManager = CredentialManager.getInstance(context) 2

    val getCredentialOption = // create GetCredentialOption suitable for authentication method 3 val getCredentialRequest = GetCredentialRequest.Builder() 4 .addCredentialOption(getCredentialOption) 5 .build() 複数の認証方式を同時にサポートしたい場合は、.addCredentialOption() を複 数回呼び出すことで複数の GetCredentialOption を設定することができる 23
  28. Credential Manager 詳細 認証情報の取得 1 val credentialManager = CredentialManager.getInstance(context) 2

    val getCredentialOption = // create GetCredentialOption suitable for authentication method 3 val getCredentialRequest = GetCredentialRequest.Builder() 4 .addCredentialOption(getCredentialOption) 5 .build() 6 7 coroutineScope.launch { 8 val response = credentialManager.getCredential( 9 context = context, 10 request = getCredentialRequest 11 ) 12 } 23
  29. Credential Manager 詳細 認証情報の取得 1 coroutineScope.launch { 2 val response

    = credentialManager.getCredential( 3 context = context, 4 request = getCredentialRequest 5 ) 6 } ! getCredential の引数の context は、 UI を起動するために使用されるた め、 Activity Context を使用する 23
  30. Credential Manager 詳細 認証情報の取得 1 val credentialManager = CredentialManager.getInstance(context) 2

    val getCredentialOption = // create GetCredentialOption suitable for authentication method 3 val getCredentialRequest = GetCredentialRequest.Builder() 4 .addCredentialOption(getCredentialOption) 5 .build() 6 coroutineScope.launch { 7 val response = credentialManager.getCredential( 8 context = context, 9 request = getCredentialRequest 10 ) 11 // handle data from response 12 } 23
  31. Credential Manager 詳細 認証情報の登録 1 val credentialManager = CredentialManager.getInstance(context) 2

    val createCredentialRequest = // create CreateCredentialRequest suitable for authentication method 24
  32. Credential Manager 詳細 認証情報の登録 1 val credentialManager = CredentialManager.getInstance(context) 2

    val createCredentialRequest = // create CreateCredentialRequest suitable for authentication method 3 4 coroutineScope.launch { 5 val response = credentialManager.createCredential( 6 context = context, 7 request = createCredentialRequest 8 ) 9 } ! createCredential の引数の context は、 UI を起動するために使用される ため、 Activity Context を指定する 24
  33. Credential Manager 詳細 認証情報の登録 1 val credentialManager = CredentialManager.getInstance(context) 2

    val createCredentialRequest = // create CreateCredentialRequest suitable for authentication method 3 4 coroutineScope.launch { 5 val response = credentialManager.createCredential( 6 context = context, 7 request = createCredentialRequest 8 ) 9 // handle data from response 10 } 24
  34. Credential Manager 詳細 認証情報の状態の削除 1 val credentialManager = CredentialManager.getInstance(context) 2

    val clearCredentialStateRequest = ClearCredentialStateRequest() 3 4 coroutineScope.launch { 5 credentialManager.clearCredentialState( 6 request = clearCredentialStateRequest 7 ) 8 } 25
  35. Google Sign-in の移行 Play Services Auth SDK を使う方法のおさらい 1 //

    build.gradle 2 dependencies { 3 ... 4 implementation(”com.google.android.gms:play-services-auth:21.2.0”) 5 ... 6 } 26
  36. Google Sign-in の移行 Play Services Auth SDK を使う方法のおさらい 1 //

    build.gradle 2 dependencies { 3 ... 4 implementation(”com.google.android.gms:play-services-auth:21.2.0”) 5 ... 6 } Play Services Auth SDK に入っている API Google Sign-In for Android Google Identity Services → Sign in with Google について大まかな実装を確認 26
  37. Google Sign-in の移行 Play Services Auth SDK を使う方法のおさらい - Google

    Sign-In for Android 1 val signInWithGoogleLauncher = registerForActivityResult(/* ... */) 2 3 fun startSignInWithGoogle() { 4 val signInIntent = GoogleSignIn.getClient( 5 context, 6 GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 7 .requestIdToken(/* Web Client ID */) 8 .build() 9 ).signInIntent 10 11 signInWithGoogleLauncher.launch(signInIntent) 12 } 27
  38. Google Sign-in の移行 Play Services Auth SDK を使う方法のおさらい - Google

    Sign-In for Android 1 val signInWithGoogleLauncher = registerForActivityResult(/* ... */) 2 3 fun startSignInWithGoogle() { 4 val signInIntent = GoogleSignIn.getClient( 5 context, 6 GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 7 .requestIdToken(/* Web Client ID */) 8 .build() 9 ).signInIntent 10 11 signInWithGoogleLauncher.launch(signInIntent) 12 } 27
  39. Google Sign-in の移行 Play Services Auth SDK を使う方法のおさらい - Google

    Sign-In for Android 1 val signInWithGoogleLauncher = registerForActivityResult(/* ... */) 2 3 fun startSignInWithGoogle() { 4 val signInIntent = GoogleSignIn.getClient( 5 context, 6 GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 7 .requestIdToken(/* Web Client ID */) 8 .build() 9 ).signInIntent 10 11 signInWithGoogleLauncher.launch(signInIntent) 12 } 27
  40. Google Sign-in の移行 Play Services Auth SDK を使う方法のおさらい - Google

    Sign-In for Android 1 val signInWithGoogleLauncher = registerForActivityResult(/* ... */) 2 3 fun startSignInWithGoogle() { 4 val signInIntent = GoogleSignIn.getClient( 5 context, 6 GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 7 .requestIdToken(/* Web Client ID */) 8 .build() 9 ).signInIntent 10 11 signInWithGoogleLauncher.launch(signInIntent) 12 } 27
  41. Google Sign-in の移行 Play Services Auth SDK を使う方法のおさらい - Google

    Sign-In for Android 1 val signInWithGoogleLauncher = registerForActivityResult(/* ... */) 2 3 fun startSignInWithGoogle() { 4 val signInIntent = GoogleSignIn.getClient( 5 context, 6 GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 7 .requestIdToken(/* Web Client ID */) 8 .build() 9 ).signInIntent 10 11 signInWithGoogleLauncher.launch(signInIntent) 12 } 27
  42. Google Sign-in の移行 Play Services Auth SDK を使う方法のおさらい - Google

    Identity Services 1 override fun onActivityResult(// ... 2 3 fun startSignInWithGoogle() { 4 Identity.getSignInClient(this@HogeActivity).getSignInIntent( 5 GetSignInIntentRequest.builder() 6 .setServerClientId(/* Web Client ID */) 7 .build() 8 ) 9 .addOnSuccessListener { pendingIntent -> 10 startIntentSenderForResult( 11 pendingIntent.intentSender, REQUEST_CODE, /* ... */ 12 ) 13 } 14 } 28
  43. Google Sign-in の移行 Play Services Auth SDK を使う方法のおさらい - Google

    Identity Services 1 override fun onActivityResult(// ... 2 3 fun startSignInWithGoogle() { 4 Identity.getSignInClient(this@HogeActivity).getSignInIntent( 5 GetSignInIntentRequest.builder() 6 .setServerClientId(/* Web Client ID */) 7 .build() 8 ) 9 .addOnSuccessListener { pendingIntent -> 10 startIntentSenderForResult( 11 pendingIntent.intentSender, REQUEST_CODE, /* ... */ 12 ) 13 } 14 } 28
  44. Google Sign-in の移行 Play Services Auth SDK を使う方法のおさらい - Google

    Identity Services 1 override fun onActivityResult(// ... 2 3 fun startSignInWithGoogle() { 4 Identity.getSignInClient(this@HogeActivity).getSignInIntent( 5 GetSignInIntentRequest.builder() 6 .setServerClientId(/* Web Client ID */) 7 .build() 8 ) 9 .addOnSuccessListener { pendingIntent -> 10 startIntentSenderForResult( 11 pendingIntent.intentSender, REQUEST_CODE, /* ... */ 12 ) 13 } 14 } 28
  45. Google Sign-in の移行 Play Services Auth SDK を使う方法のおさらい - Google

    Identity Services 1 override fun onActivityResult(// ... 2 3 fun startSignInWithGoogle() { 4 Identity.getSignInClient(this@HogeActivity).getSignInIntent( 5 GetSignInIntentRequest.builder() 6 .setServerClientId(/* Web Client ID */) 7 .build() 8 ) 9 .addOnSuccessListener { pendingIntent -> 10 startIntentSenderForResult( 11 pendingIntent.intentSender, REQUEST_CODE, /* ... */ 12 ) 13 } 14 } 28
  46. Google Sign-in の移行 Play Services Auth SDK を使う方法のおさらい - Google

    Identity Services 1 override fun onActivityResult(// ... 2 3 fun startSignInWithGoogle() { 4 Identity.getSignInClient(this@HogeActivity).getSignInIntent( 5 GetSignInIntentRequest.builder() 6 .setServerClientId(/* Web Client ID */) 7 .build() 8 ) 9 .addOnSuccessListener { pendingIntent -> 10 startIntentSenderForResult( 11 pendingIntent.intentSender, REQUEST_CODE, /* ... */ 12 ) 13 } 14 } 28
  47. Google Sign-in の移行 やってることはだいたい同じ Sign-In で使用する Client を作成して、そこから Intent を取得

    Intent 作成時の設定には、 Web Client ID を指定 Intent や PendingIntent を使って UI を表示して、ユーザの操作を待ち受ける 29
  48. Credential Manager を使用した Google Sign-in の実装 Credential Manager で Google

    Sign-in を実装するために必要なライブラリ 1 implementation(”androidx.credentials:credentials:1.2.2”) 2 // For minSdkVersion < 34 3 implementation(”androidx.credentials:credentials-play-services-auth:1.2.2 ”) 4 implementation(”com.google.android.libraries.identity.googleid:googleid :1.1.1”) 30
  49. Credential Manager を使用した Google Sign-in の実装 Credential Manager で Google

    Sign-in を実装するために必要なライブラリ 1 implementation(”androidx.credentials:credentials:1.2.2”) 2 // For minSdkVersion < 34 3 implementation(”androidx.credentials:credentials-play-services-auth:1.2.2 ”) 4 implementation(”com.google.android.libraries.identity.googleid:googleid :1.1.1”) Jetpack credentials は Stable が 1.2.2、 RC が 1.3.0-rc01、 Alpha が 1.5.0-alpha04 API は今回使用する部分に関しては変わっていない 1.2 系は minSdkVersion は 19 だが、 1.3.0-alpha04 から、 AndroidX のデフォル トに合わせる形で minSdkVersion が 21 に引き上げられた 30
  50. Credential Manager を使用した Google Sign-in の実装 Credential Manager で Google

    Sign-in を実装するために必要なライブラリ 1 implementation(”androidx.credentials:credentials:1.2.2”) 2 // For minSdkVersion < 34 3 implementation(”androidx.credentials:credentials-play-services-auth:1.2.2 ”) 4 implementation(”com.google.android.libraries.identity.googleid:googleid :1.1.1”) Jetpack credentials は Stable が 1.2.2、 RC が 1.3.0-rc01、 Alpha が 1.5.0-alpha04 API は今回使用する部分に関しては変わっていない 1.2 系は minSdkVersion は 19 だが、 1.3.0-alpha04 から、 AndroidX のデフォル トに合わせる形で minSdkVersion が 21 に引き上げられた googleid には Credential Manager で Google Sign-in を実装するために必要 な、 GetCredentialOption の実装や、 Credential の実装が含まれている 30
  51. Credential Manager を使用した Google Sign-in の実装 Credential Manager で Credential

    を取得する 1 val credentialManager = CredentialManager.getInstance(context) 2 val getCredentialOption = // GetCredentialOption for Google Sign-in 3 val getCredentialRequest = GetCredentialRequest.Builder() 4 .addCredentialOption(getCredentialOption) 5 .build() 6 7 coroutineScope.launch { 8 val response = credentialManager.getCredential( 9 context = context, 10 request = getCredentialRequest 11 ) 12 // handle data from response 13 } 31
  52. Credential Manager を使用した Google Sign-in の実装 Credential Manager で Credential

    を取得する 1 val credentialManager = CredentialManager.getInstance(context) 2 val getCredentialOption = // GetCredentialOption for Google Sign-in 3 val getCredentialRequest = GetCredentialRequest.Builder() 4 .addCredentialOption(getCredentialOption) 5 .build() 6 7 coroutineScope.launch { 8 val response = credentialManager.getCredential( 9 context = context, 10 request = getCredentialRequest 11 ) 12 // handle data from response 13 } 31
  53. Credential Manager を使用した Google Sign-in の実装 GetSignInWithGoogleOption の作成 1 val

    getCredentialOption = GetSignInWithGoogleOption.Builder( 2 serverClientId = /* Web Client ID */ 3 ) 4 .setNonce(nonce) 5 .build() 32
  54. Credential Manager を使用した Google Sign-in の実装 GetSignInWithGoogleOption の作成 1 val

    getCredentialOption = GetSignInWithGoogleOption.Builder( 2 serverClientId = /* Web Client ID */ 3 ) 4 .setNonce(nonce) 5 .build() Google Identity Services にも存在する設定 nonce は Base64 エンコードされている必要がある nonce は、発行される ID Token の payload に入力される 一応なくても動く 32
  55. Credential Manager を使用した Google Sign-in の実装 Nonce を設定する意味 ID Token

    と一緒にログイン時にクライアントから情報を送りたい場合、 Nonce を使っての情報の改ざん検知ができる 1. クライアントで、送りたいメッセージのハッシュ値を計算して作った値を setNonce() に指定する 2. ログインのリクエストに ID Token と一緒に改ざんを検知したいメッセージを含 める 3. サーバでリクエストに含まれているメッセージを使ってクライアントと同じ方法で ハッシュ値を計算し、 ID Token の nonce と比較する 4. もし一致しなかった場合は、リクエストを拒否する 33
  56. Credential Manager を使用した Google Sign-in の実装 Nonce を設定する意味 ID Token

    と一緒にログイン時にクライアントから情報を送りたい場合、 Nonce を使っての情報の改ざん検知ができる ID Token の盗難によるリプレイ攻撃の防止ができる 1. クライアントからのリクエスト起因で、サーバで有効性が管理されたユニークな値 を生成してクライアントに渡す 2. クライアントで、サーバからもらったユニーク値をそのまま setNonce() に指定 する 3. ログイン時に ID Token を送る 4. サーバで、 ID Token に含まれる nonce を取り出し、有効性を確認する 5. サーバで、使ったユニーク値を無効にする 33
  57. Credential Manager を使用した Google Sign-in の実装 Nonce を設定する意味 ID Token

    と一緒にログイン時にクライアントから情報を送りたい場合、 Nonce を使っての情報の改ざん検知ができる ID Token の盗難によるリプレイ攻撃の防止ができる nonce として、クライアントで作ったハッシュ値とサーバで作ったユニーク値を組み 合わせたものを使用することで、両方の目的を満たしたフローになる Google Sign-in を実装する場合は、リプレイ攻撃対策はやっておいた方が良い 33
  58. Credential Manager を使用した Google Sign-in の実装 Response から Credential を取り出す

    1 val response = try { 2 credentialManager.getCredential(context, request) 3 } catch (e: GetCredentialException()) {/* ... */} getCredential の引数の context は、 UI を起動するために使用されるた め、 Activity Context を指定する 例えばキャンセルされたときは GetCredentialCancellationException が投げられるため、エラーハンドリングも必須 34
  59. Credential Manager を使用した Google Sign-in の実装 Response から Credential を取り出す

    1 val response = try { 2 credentialManager.getCredential(/* ... */) 3 } catch (e: GetCredentialException()) {/* ... */} 4 5 val credential = response.credential 6 if ( 7 credential is CustomCredential 8 && credential.type == GoogleIdTokenCredential. TYPE_GOOGLE_ID_TOKEN_CREDENTIAL 9 ) { 10 val googleCredential = GoogleIdTokenCredential.createFrom(credential. data) 11 val idToken = googleIdTokenCredential.idToken 12 } 34
  60. Credential Manager を使用した Google Sign-in の実装 Response から Credential を取り出す

    1 val response = try { 2 credentialManager.getCredential(/* ... */) 3 } catch (e: GetCredentialException()) {/* ... */} 4 5 val credential = response.credential 6 if ( 7 credential is CustomCredential 8 && credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL 9 ) { 10 val googleCredential = GoogleIdTokenCredential.createFrom(credential. data) 11 val idToken = googleIdTokenCredential.idToken 12 } 34
  61. Credential Manager を使用した Google Sign-in の実装 Response から Credential を取り出す

    1 val response = try { 2 credentialManager.getCredential(/* ... */) 3 } catch (e: GetCredentialException()) {/* ... */} 4 5 val credential = response.credential 6 if ( 7 credential is CustomCredential 8 && credential.type == GoogleIdTokenCredential. TYPE_GOOGLE_ID_TOKEN_CREDENTIAL 9 ) { 10 val googleCredential = GoogleIdTokenCredential.createFrom(credential.data) 11 val idToken = googleIdTokenCredential.idToken 12 } 34
  62. Credential Manager を使用した Google Sign-in の実装 GetSignInWithGoogleOption で得られるのは、 Sign in

    with Google button flow Sign in with Google ボタンを押すことで開始 されるフロー Google アカウントを選択できるダイアログが 表示される 35
  63. Credential Manager を使用した Google Sign-in の実装 GetSignInWithGoogleOption で得られるのは、 Sign in

    with Google button flow Sign in with Google ボタンを押すことで開始 されるフロー Google アカウントを選択できるダイアログが 表示される GetSignInWithGoogleOption は他の GetCredentialOption と併用できない 35
  64. Credential Manager を使用した Google Sign-in の実装 GetGoogleIdOption Credential Manager の

    Bottom Sheet に Google アカウントの候補が表示される 他の GetCredentialOption と併用可能 36
  65. Credential Manager を使用した Google Sign-in の実装 GetGoogleIdOption Credential Manager の

    Bottom Sheet に Google アカウントの候補が表示される 他の GetCredentialOption と併用可能 Credential Manager の Bottom Sheet から は、別の Google アカウントを端末に追加する ことはできない 36
  66. Credential Manager を使用した Google Sign-in の実装 GetGoogleIdOption Credential Manager の

    Bottom Sheet に Google アカウントの候補が表示される 他の GetCredentialOption と併用可能 Credential Manager の Bottom Sheet から は、別の Google アカウントを端末に追加する ことはできない Google Identity Services の One Tap sign-in と同じようなものとして捉えられる 36
  67. Credential Manager を使用した Google Sign-in の実装 GetGoogleIdOption の作成 1 val

    googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder() 2 .setServerClientId(/* Web Client ID */) 3 .setNonce(nonce) 4 .setFilterByAuthorizedAccounts(true) 5 .setAutoSelectEnabled(true) 6 .build() 37
  68. Credential Manager を使用した Google Sign-in の実装 GetGoogleIdOption の作成 1 val

    googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder() 2 .setServerClientId(/* Web Client ID */) 3 .setNonce(nonce) 4 .setFilterByAuthorizedAccounts(true) 5 .setAutoSelectEnabled(true) 6 .build() Google Identity Services にも存在する設定 表示される選択肢が、紐付け済みのアカウントだけになる 37
  69. Credential Manager を使用した Google Sign-in の実装 GetGoogleIdOption の作成 1 val

    googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder() 2 .setServerClientId(/* Web Client ID */) 3 .setNonce(nonce) 4 .setFilterByAuthorizedAccounts(true) 5 .setAutoSelectEnabled(true) 6 .build() Google Identity Services にも存在する設定 表示される選択肢が 1 件の場合、自動的に選択される 37
  70. Credential Manager を使用した Google Sign-in の実装 ログアウト時は、 Credential Manager の

    clearCredentialState メソッドを呼 び出す 1 val credentialManager = CredentialManager.getInstance(context) 2 val clearCredentialStateRequest = ClearCredentialStateRequest() 3 4 coroutineScope.launch { 5 credentialManager.clearCredentialState( 6 request = clearCredentialStateRequest 7 ) 8 } 38
  71. Google Sign-in の移行 Sign in with Google button flow GetSignInWithGoogleOption

    を利用 Web Client ID をコピー ActivityResult の返り値に対する処理を Coroutine に置き換える 39
  72. Google Sign-in の移行 Sign in with Google button flow GetSignInWithGoogleOption

    を利用 Web Client ID をコピー ActivityResult の返り値に対する処理を Coroutine に置き換える One Tap sign-in GetGoogleIdOption を利用 Web Client ID をコピー アカウントのフィルタリングや自動選択をコピー ActivityResult の返り値に対する処理を Coroutine に置き換える 39
  73. Google Sign-in の移行 Sign in with Google button flow GetSignInWithGoogleOption

    を利用 Web Client ID をコピー ActivityResult の返り値に対する処理を Coroutine に置き換える One Tap sign-in GetGoogleIdOption を利用 Web Client ID をコピー アカウントのフィルタリングや自動選択をコピー ActivityResult の返り値に対する処理を Coroutine に置き換える Google アカウントのデータにアクセスするための認可 Google Identity Services の AuthorizationClient を利用 39
  74. まとめ 現状 Google Sign-In の実装に使っている機能が、 2025 年に com.google.android.gms:play-services-auth から削除される Credential

    Manager は Android デバイス上で管理されている認証情報を使用す る統一的な方法を提供する Google Sign-In の機能も提供する 41
  75. まとめ 現状 Google Sign-In の実装に使っている機能が、 2025 年に com.google.android.gms:play-services-auth から削除される Credential

    Manager は Android デバイス上で管理されている認証情報を使用す る統一的な方法を提供する Google Sign-In の機能も提供する 移行作業自体は簡単だが、自分が何をしているのか理解しながら移行することが 重要 41
  76. References [1] Google. Overview of Google Play services. https://developers.google.com/android/guides/overview. Sept.

    2024. [2] Google. Sign in your user with Credential Manager. https: //developer.android.com/identity/sign-in/credential-manager. Sept. 2024. [3] Google. Start Integrating Google Sign-In into Your Android App. https://developers.google.com/identity/sign-in/android/legacy- start-integrating. Sept. 2024. 42
  77. [4] Google. com.google.android.gms.auth.api.signin. https://developers.google.com/android/reference/com/google/ android/gms/auth/api/signin/package-summary. Sept. 2024. [5] Google. New

    Google Sign-In API. https://developers.google.com/identity/sign-in/android/sign- in-identity. Sept. 2024. [6] Google. com.google.android.gms.auth.api.identity. https://developers.google.com/android/reference/com/google/ android/gms/auth/api/identity/package-summary. Sept. 2024. [7] Google. Authenticate users with Sign in with Google. https://developer.android.com/identity/sign-in/credential- manager-siwg. Sept. 2024. 43