Slide 1

Slide 1 text

Google Sign-in の移行から始める Credential Manager 活用 clockvoid (Hidenari Tajima) 2024 年 9 月 13 日

Slide 2

Slide 2 text

自己紹介 名前 田嶋秀成 所属 DeNA 職業 ソフトウェアエンジニア 趣味 Arch Linux 盆栽 Twitter @clockvoid GitHub clockvoid 1

Slide 3

Slide 3 text

Google Sign-in

Slide 4

Slide 4 text

Google Sign-in 2

Slide 5

Slide 5 text

Google Sign-in Google Sign-In for Android 3

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

本発表の構成 ①基礎的な部分についての説明 Google Play services 概要 Auth SDK について Credential Manager 概要 仕組みと使い方 7

Slide 10

Slide 10 text

本発表の構成 ①基礎的な部分についての説明 Google Play services 概要 Auth SDK について Credential Manager 概要 仕組みと使い方 ② Google Sign-In の移行 Legacy な Google Sign-In の組み 込み方についておさらい Credential Manager での実装 方法 7

Slide 11

Slide 11 text

Google Play services

Slide 12

Slide 12 text

Google Play services Android スマートフォン向けの様々なサービを提供 するためのアプリ システムアプリとしてインストールされている 普通に設定アプリのアプリ一覧から見つけることが できる 削除したり、停止したりできないようになっている Google Play からアップデートできる 8

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Google Play services クライアントライブラリ Google Play services の機能をアプリから利用するためのライブラリ com.google.android.gms:play-services-{機能名}という Maven artifact で提供されていることが多い 10

Slide 15

Slide 15 text

Google Play services クライアントライブラリ クライアントライブラリは、 Google Play services と IPC で通信をすること で、 Google Play sevices の機能を呼び出している App Google Play services Client library B Client library A IPC 11

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Google Play services Google Sign-In for Android の機能 Sign in with Google Google のデータにアクセスするための認可プ ロセスの提供 →現在は Deprecated で、 2025 年に削除される 予定 13

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Credential Manager

Slide 25

Slide 25 text

Credential Manager Credential Manager とは、様々な形式の認証情報をまとめて扱うためのライブラリ 15

Slide 26

Slide 26 text

Credential Manager Credential Manager とは、様々な形式の認証情報をまとめて扱うためのライブラリ ユーザは、複数の認証方式を 1 つの UI で扱 える 15

Slide 27

Slide 27 text

Credential Manager Credential Manager とは、様々な形式の認証情報をまとめて扱うためのライブラリ ユーザは、複数の認証方式を 1 つの UI で扱 える 開発者は、複数の認証方式を統一された API で扱える 15

Slide 28

Slide 28 text

Credential Manager 大まかに Credential Manager がやっていること アプリの外にあるパスワードマネージャなどにアクセスし、認証情報を保存した り、取り出したりする Credential Manager アプリ Credential provider (パスワードマネージャなど) Credential Manager 自身が認証情報を保持するわけではない 16

Slide 29

Slide 29 text

Credential Manager 大まかに Credential Manager がやっていること アプリの外にあるパスワードマネージャなどにアクセスし、認証情報を保存した り、取り出したりする 取り扱う認証情報の種類に問わず、認証情報を取り扱うための抽象化された API を提供する 16

Slide 30

Slide 30 text

Credential Manager 詳細 Credential Manager の内部構造 Jetpack の credentials というライブラリが API を提供 17

Slide 31

Slide 31 text

Credential Manager 詳細 Credential Manager の内部構造 Jetpack の credentials というライブラリが API を提供 Android 14 以上と Android 13 以下で、動きが異なる Android 14 Android 12 17

Slide 32

Slide 32 text

Credential Manager 詳細 Android 14 以上での Credential Manager CredentialManager という名前のネイティブ API が Android 14 で導入された 18

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

Credential Manager 詳細 Credential Manager が提供する API 認証情報の取得 認証情報の登録 認証情報の状態の削除 22

Slide 44

Slide 44 text

Credential Manager 詳細 認証情報の取得 1 val credentialManager = CredentialManager.getInstance(context) 23

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

Credential Manager 詳細 認証情報の登録 1 val credentialManager = CredentialManager.getInstance(context) 24

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

Credential Manager 詳細 認証情報の状態の削除 システムが認識しているすべての credential provider に対して、このアプリのため のセッションをクリアする必要があることを通知する 25

Slide 55

Slide 55 text

Credential Manager 詳細 認証情報の状態の削除 1 val credentialManager = CredentialManager.getInstance(context) 25

Slide 56

Slide 56 text

Credential Manager 詳細 認証情報の状態の削除 1 val credentialManager = CredentialManager.getInstance(context) 2 val clearCredentialStateRequest = ClearCredentialStateRequest() 25

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

Google Sign-in の移行

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

Google Sign-in の移行 やってることはだいたい同じ Sign-In で使用する Client を作成して、そこから Intent を取得 Intent 作成時の設定には、 Web Client ID を指定 Intent や PendingIntent を使って UI を表示して、ユーザの操作を待ち受ける 29

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

Google Sign-in の移行 出てくるダイアログのデザインが Google Sign-In for Android とそれ以外で違う Google Sign-In for Android GIS / Credential Manager 40

Slide 99

Slide 99 text

まとめ 現状 Google Sign-In の実装に使っている機能が、 2025 年に com.google.android.gms:play-services-auth から削除される 41

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

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

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

[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

Slide 104

Slide 104 text

[8] Google. Authorize access to user data on Android. https://developers.google.com/identity/authorization/android. Sept. 2024. 44