From d8709fe747b800b7178c13de436bdc5df7d17d39 Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 18:46:48 +0530 Subject: [PATCH 01/22] Minor updates to snippets for doc restructuring Made the following changes: - Updated comments for clarity - Replaced random example values with placeholders - Added SignInJsonRequest --- .../PasskeyAndPasswordFunctions.kt | 27 +++++----- .../src/main/jsonSnippets.json | 52 +++++++++---------- 2 files changed, 41 insertions(+), 38 deletions(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index 747f72c15..ee7888eb8 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -70,11 +70,10 @@ class PasskeyAndPasswordFunctions( ) { val requestJson = creationResult.toString() // [START android_identity_get_password_passkey_options] - // Retrieves the user's saved password for your app from their - // password provider. + // Get the the password logins from the credential provider on the user's device val getPasswordOption = GetPasswordOption() - // Get passkey from the user's public key credential provider. + // Get the passkeys from the credential provider on the user's device val getPublicKeyCredentialOption = GetPublicKeyCredentialOption( requestJson = requestJson ) @@ -82,7 +81,11 @@ class PasskeyAndPasswordFunctions( var result: GetCredentialResponse // [START android_identity_get_credential_request] val credentialRequest = GetCredentialRequest( + // Include all the sign-in options that your app supports listOf(getPasswordOption, getPublicKeyCredentialOption), + // Defines whether you prefer to use only immediately available + // credentials or hybrid credentials. + preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials ) // [END android_identity_get_credential_request] runBlocking { @@ -92,7 +95,8 @@ class PasskeyAndPasswordFunctions( val response = credentialManager.prepareGetCredential( GetCredentialRequest( listOf( - getPublicKeyCredentialOption, + // Include all the sign-in options that your app supports + getPublicKeyCredentialOption, getPasswordOption ) ) @@ -231,18 +235,17 @@ class PasskeyAndPasswordFunctions( // [START android_identity_create_passkey] suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) { val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest( - // Contains the request in JSON format. Uses the standard WebAuthn - // web JSON spec. + // Contains the request in JSON format. requestJson = requestJson, - // Defines whether you prefer to use only immediately available - // credentials, not hybrid credentials, to fulfill this request. - // This value is false by default. + // Defines whether you prefer to use only locally-available + // credentials or hybrid credentials. preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials, + // Automatically create a passkey if the user does not have one. + isConditionalCreateRequest = true ) - // Execute CreateCredentialRequest asynchronously to register credentials - // for a user account. Handle success and failure cases with the result and - // exceptions, respectively. + // Execute createCredential asynchronously to register credentials + // for a user account. coroutineScope { try { val result = credentialManager.createCredential( diff --git a/identity/credentialmanager/src/main/jsonSnippets.json b/identity/credentialmanager/src/main/jsonSnippets.json index 9cbccd4e1..694dee285 100644 --- a/identity/credentialmanager/src/main/jsonSnippets.json +++ b/identity/credentialmanager/src/main/jsonSnippets.json @@ -57,14 +57,14 @@ // JSON response format // [START android_identity_format_json_response_passkey] { - "id": "KEDetxZcUfinhVi6Za5nZQ", + "id": "", "type": "public-key", - "rawId": "KEDetxZcUfinhVi6Za5nZQ", + "rawId": "", "response": { - "clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoiVDF4Q3NueE0yRE5MMktkSzVDTGE2Zk1oRDdPQnFobzZzeXpJbmtfbi1VbyIsIm9yaWdpbiI6ImFuZHJvaWQ6YXBrLWtleS1oYXNoOk1MTHpEdll4UTRFS1R3QzZVNlpWVnJGUXRIOEdjVi0xZDQ0NEZLOUh2YUkiLCJhbmRyb2lkUGFja2FnZU5hbWUiOiJjb20uZ29vZ2xlLmNyZWRlbnRpYWxtYW5hZ2VyLnNhbXBsZSJ9", - "authenticatorData": "j5r_fLFhV-qdmGEwiukwD5E_5ama9g0hzXgN8thcFGQdAAAAAA", - "signature": "MEUCIQCO1Cm4SA2xiG5FdKDHCJorueiS04wCsqHhiRDbbgITYAIgMKMFirgC2SSFmxrh7z9PzUqr0bK1HZ6Zn8vZVhETnyQ", - "userHandle": "2HzoHm_hY0CjuEESY9tY6-3SdjmNHOoNqaPDcZGzsr0" + "clientDataJSON": "", + "authenticatorData": "", + "signature": "digital_signature_to_be_verified", + "userHandle": "user_id_from_credential_registration" } } // [END android_identity_format_json_response_passkey] @@ -74,40 +74,30 @@ // Json request for creating a passkey // [START android_identity_create_passkey_request_json] { - "challenge": "abc123", + "challenge": "", "rp": { - "name": "Credential Manager example", - "id": "credential-manager-test.example.com" + "name": "", + "id": "" }, "user": { - "id": "def456", - "name": "helloandroid@gmail.com", - "displayName": "helloandroid@gmail.com" + "id": "", + "name": "", + "displayName": "" }, "pubKeyCredParams": [ { "type": "public-key", "alg": -7 - }, - { - "type": "public-key", - "alg": -257 } ], - "timeout": 1800000, "attestation": "none", "excludeCredentials": [ { - "id": "ghi789", - "type": "public-key" - }, - { - "id": "jkl012", - "type": "public-key" + "id": "", + "type": "public-key" } ], "authenticatorSelection": { - "authenticatorAttachment": "platform", "requireResidentKey": true, "residentKey": "required", "userVerification": "required" @@ -129,7 +119,17 @@ } } // [END android_identity_create_passkey_response_json] - } - + }, + { + "SignInJsonRequest": + //Json object sent by server when creating sign-in request + // [START android_identity_create_sign_in_request_json] + { + "challenge": "", + "allowCredentials": [], + "rpId": "" + } + // [END android_identity_create_sign_in_request_json] + } ] } \ No newline at end of file From bd8dec6e4f701bdb5a942167bef0b930b19f5f42 Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 19:20:17 +0530 Subject: [PATCH 02/22] Initialize preferImmediatelyAvailableCredentials --- .../identity/credentialmanager/PasskeyAndPasswordFunctions.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index ee7888eb8..3ff5f04da 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -79,6 +79,7 @@ class PasskeyAndPasswordFunctions( ) // [END android_identity_get_password_passkey_options] var result: GetCredentialResponse + var preferImmediatelyAvailableCredentials: Boolean = false // [START android_identity_get_credential_request] val credentialRequest = GetCredentialRequest( // Include all the sign-in options that your app supports From 4b34cc0eb1190974a073e22a43833740efa5f4d1 Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 20:32:04 +0530 Subject: [PATCH 03/22] Update PasskeyAndPasswordFunctions.kt --- .../identity/credentialmanager/PasskeyAndPasswordFunctions.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index 3ff5f04da..de1a975fc 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -80,6 +80,7 @@ class PasskeyAndPasswordFunctions( // [END android_identity_get_password_passkey_options] var result: GetCredentialResponse var preferImmediatelyAvailableCredentials: Boolean = false + var isConditionalCreateRequest: Boolean = false // [START android_identity_get_credential_request] val credentialRequest = GetCredentialRequest( // Include all the sign-in options that your app supports @@ -242,7 +243,7 @@ class PasskeyAndPasswordFunctions( // credentials or hybrid credentials. preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials, // Automatically create a passkey if the user does not have one. - isConditionalCreateRequest = true + isConditionalCreateRequest = isConditionalCreateRequest ) // Execute createCredential asynchronously to register credentials From e4388f04fb55344ea431644f90e89e04b9656f33 Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 22:50:19 +0530 Subject: [PATCH 04/22] Update PasskeyAndPasswordFunctions.kt --- .../identity/credentialmanager/PasskeyAndPasswordFunctions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index de1a975fc..8ee92e494 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -80,7 +80,6 @@ class PasskeyAndPasswordFunctions( // [END android_identity_get_password_passkey_options] var result: GetCredentialResponse var preferImmediatelyAvailableCredentials: Boolean = false - var isConditionalCreateRequest: Boolean = false // [START android_identity_get_credential_request] val credentialRequest = GetCredentialRequest( // Include all the sign-in options that your app supports @@ -236,6 +235,7 @@ class PasskeyAndPasswordFunctions( // [START android_identity_create_passkey] suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) { + var isConditionalCreateRequest: Boolean = false val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest( // Contains the request in JSON format. requestJson = requestJson, From 9c76fa8429355e874cbc8b99a38f328c8340360b Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 23:21:12 +0530 Subject: [PATCH 05/22] Update libs.versions.toml --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5517bdcc1..3ed980c7b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,8 +12,8 @@ androidx-constraintlayout = "2.2.1" androidx-constraintlayout-compose = "1.1.1" androidx-coordinator-layout = "1.3.0" androidx-corektx = "1.17.0" -androidx-credentials = "1.5.0" -androidx-credentials-play-services-auth = "1.5.0" +androidx-credentials = "1.6.0-beta03" +androidx-credentials-play-services-auth = "1.6.0-beta03" androidx-emoji2-views = "1.6.0" androidx-fragment-ktx = "1.8.9" androidx-glance-appwidget = "1.1.1" From ed69a7f6696780a5715d20dcf581ac263bc768ba Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 23:41:07 +0530 Subject: [PATCH 06/22] Update PasskeyAndPasswordFunctions.kt --- .../credentialmanager/PasskeyAndPasswordFunctions.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index 8ee92e494..f921952e4 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -70,10 +70,10 @@ class PasskeyAndPasswordFunctions( ) { val requestJson = creationResult.toString() // [START android_identity_get_password_passkey_options] - // Get the the password logins from the credential provider on the user's device + // Get password logins from the credential provider on the user's device. val getPasswordOption = GetPasswordOption() - // Get the passkeys from the credential provider on the user's device + // Get passkeys from the credential provider on the user's device. val getPublicKeyCredentialOption = GetPublicKeyCredentialOption( requestJson = requestJson ) @@ -82,7 +82,7 @@ class PasskeyAndPasswordFunctions( var preferImmediatelyAvailableCredentials: Boolean = false // [START android_identity_get_credential_request] val credentialRequest = GetCredentialRequest( - // Include all the sign-in options that your app supports + // Include all the sign-in options that your app supports. listOf(getPasswordOption, getPublicKeyCredentialOption), // Defines whether you prefer to use only immediately available // credentials or hybrid credentials. @@ -235,7 +235,6 @@ class PasskeyAndPasswordFunctions( // [START android_identity_create_passkey] suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) { - var isConditionalCreateRequest: Boolean = false val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest( // Contains the request in JSON format. requestJson = requestJson, @@ -243,7 +242,7 @@ class PasskeyAndPasswordFunctions( // credentials or hybrid credentials. preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials, // Automatically create a passkey if the user does not have one. - isConditionalCreateRequest = isConditionalCreateRequest + isConditionalCreateRequest: Boolean = true ) // Execute createCredential asynchronously to register credentials From 890ced9a472e6789577018ad16cdca8f7d4a080a Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 23:50:09 +0530 Subject: [PATCH 07/22] Update PasskeyAndPasswordFunctions.kt --- .../identity/credentialmanager/PasskeyAndPasswordFunctions.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index f921952e4..63f009f63 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -235,6 +235,7 @@ class PasskeyAndPasswordFunctions( // [START android_identity_create_passkey] suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) { + var isConditionalCreateRequest: Boolean = false val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest( // Contains the request in JSON format. requestJson = requestJson, @@ -242,7 +243,7 @@ class PasskeyAndPasswordFunctions( // credentials or hybrid credentials. preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials, // Automatically create a passkey if the user does not have one. - isConditionalCreateRequest: Boolean = true + isConditionalCreateRequest: isConditionalCreateRequest ) // Execute createCredential asynchronously to register credentials From 181442b3ac30797a19671fc61a34026240cd68ac Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 23:56:13 +0530 Subject: [PATCH 08/22] Update PasskeyAndPasswordFunctions.kt --- .../identity/credentialmanager/PasskeyAndPasswordFunctions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index 63f009f63..f190c1d9e 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -243,7 +243,7 @@ class PasskeyAndPasswordFunctions( // credentials or hybrid credentials. preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials, // Automatically create a passkey if the user does not have one. - isConditionalCreateRequest: isConditionalCreateRequest + isConditionalCreateRequest = isConditionalCreateRequest ) // Execute createCredential asynchronously to register credentials From 55b0415119644704c03c939707fd3d1a1c51599f Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Thu, 23 Oct 2025 00:07:40 +0530 Subject: [PATCH 09/22] Update PasskeyAndPasswordFunctions.kt --- .../identity/credentialmanager/PasskeyAndPasswordFunctions.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index f190c1d9e..60ab33d2c 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -235,7 +235,7 @@ class PasskeyAndPasswordFunctions( // [START android_identity_create_passkey] suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) { - var isConditionalCreateRequest: Boolean = false + var isConditional: Boolean = false val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest( // Contains the request in JSON format. requestJson = requestJson, @@ -243,7 +243,7 @@ class PasskeyAndPasswordFunctions( // credentials or hybrid credentials. preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials, // Automatically create a passkey if the user does not have one. - isConditionalCreateRequest = isConditionalCreateRequest + isConditional = isConditional ) // Execute createCredential asynchronously to register credentials From 628f1f00f1ca9fc2c8aa96f374fa96fd729f174e Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Thu, 23 Oct 2025 00:41:04 +0530 Subject: [PATCH 10/22] Update jsonSnippets.json --- identity/credentialmanager/src/main/jsonSnippets.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/identity/credentialmanager/src/main/jsonSnippets.json b/identity/credentialmanager/src/main/jsonSnippets.json index 694dee285..d583d2c2d 100644 --- a/identity/credentialmanager/src/main/jsonSnippets.json +++ b/identity/credentialmanager/src/main/jsonSnippets.json @@ -110,13 +110,14 @@ // Json response when creating a passkey // [START android_identity_create_passkey_response_json] { - "id": "KEDetxZcUfinhVi6Za5nZQ", + "id": "", "type": "public-key", - "rawId": "KEDetxZcUfinhVi6Za5nZQ", + "rawId": "", "response": { - "clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoibmhrUVhmRTU5SmI5N1Z5eU5Ka3ZEaVh1Y01Fdmx0ZHV2Y3JEbUdyT0RIWSIsIm9yaWdpbiI6ImFuZHJvaWQ6YXBrLWtleS1oYXNoOk1MTHpEdll4UTRFS1R3QzZVNlpWVnJGUXRIOEdjVi0xZDQ0NEZLOUh2YUkiLCJhbmRyb2lkUGFja2FnZU5hbWUiOiJjb20uZ29vZ2xlLmNyZWRlbnRpYWxtYW5hZ2VyLnNhbXBsZSJ9", - "attestationObject": "o2NmbXRkbm9uZWdhdHRTdG10oGhhdXRoRGF0YViUj5r_fLFhV-qdmGEwiukwD5E_5ama9g0hzXgN8thcFGRdAAAAAAAAAAAAAAAAAAAAAAAAAAAAEChA3rcWXFH4p4VYumWuZ2WlAQIDJiABIVgg4RqZaJyaC24Pf4tT-8ONIZ5_Elddf3dNotGOx81jj3siWCAWXS6Lz70hvC2g8hwoLllOwlsbYatNkO2uYFO-eJID6A" - } + "clientDataJSON": "", + "attestationObject": "" + }, + "authenticatorAttachment": "platform" } // [END android_identity_create_passkey_response_json] }, From 66061c9b88ba64013ff1cffbccfd9cd0b3a892df Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 18:46:48 +0530 Subject: [PATCH 11/22] Minor updates to snippets for doc restructuring Made the following changes: - Updated comments for clarity - Replaced random example values with placeholders - Added SignInJsonRequest --- .../PasskeyAndPasswordFunctions.kt | 27 +++++----- .../src/main/jsonSnippets.json | 52 +++++++++---------- 2 files changed, 41 insertions(+), 38 deletions(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index 747f72c15..ee7888eb8 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -70,11 +70,10 @@ class PasskeyAndPasswordFunctions( ) { val requestJson = creationResult.toString() // [START android_identity_get_password_passkey_options] - // Retrieves the user's saved password for your app from their - // password provider. + // Get the the password logins from the credential provider on the user's device val getPasswordOption = GetPasswordOption() - // Get passkey from the user's public key credential provider. + // Get the passkeys from the credential provider on the user's device val getPublicKeyCredentialOption = GetPublicKeyCredentialOption( requestJson = requestJson ) @@ -82,7 +81,11 @@ class PasskeyAndPasswordFunctions( var result: GetCredentialResponse // [START android_identity_get_credential_request] val credentialRequest = GetCredentialRequest( + // Include all the sign-in options that your app supports listOf(getPasswordOption, getPublicKeyCredentialOption), + // Defines whether you prefer to use only immediately available + // credentials or hybrid credentials. + preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials ) // [END android_identity_get_credential_request] runBlocking { @@ -92,7 +95,8 @@ class PasskeyAndPasswordFunctions( val response = credentialManager.prepareGetCredential( GetCredentialRequest( listOf( - getPublicKeyCredentialOption, + // Include all the sign-in options that your app supports + getPublicKeyCredentialOption, getPasswordOption ) ) @@ -231,18 +235,17 @@ class PasskeyAndPasswordFunctions( // [START android_identity_create_passkey] suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) { val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest( - // Contains the request in JSON format. Uses the standard WebAuthn - // web JSON spec. + // Contains the request in JSON format. requestJson = requestJson, - // Defines whether you prefer to use only immediately available - // credentials, not hybrid credentials, to fulfill this request. - // This value is false by default. + // Defines whether you prefer to use only locally-available + // credentials or hybrid credentials. preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials, + // Automatically create a passkey if the user does not have one. + isConditionalCreateRequest = true ) - // Execute CreateCredentialRequest asynchronously to register credentials - // for a user account. Handle success and failure cases with the result and - // exceptions, respectively. + // Execute createCredential asynchronously to register credentials + // for a user account. coroutineScope { try { val result = credentialManager.createCredential( diff --git a/identity/credentialmanager/src/main/jsonSnippets.json b/identity/credentialmanager/src/main/jsonSnippets.json index 9cbccd4e1..694dee285 100644 --- a/identity/credentialmanager/src/main/jsonSnippets.json +++ b/identity/credentialmanager/src/main/jsonSnippets.json @@ -57,14 +57,14 @@ // JSON response format // [START android_identity_format_json_response_passkey] { - "id": "KEDetxZcUfinhVi6Za5nZQ", + "id": "", "type": "public-key", - "rawId": "KEDetxZcUfinhVi6Za5nZQ", + "rawId": "", "response": { - "clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoiVDF4Q3NueE0yRE5MMktkSzVDTGE2Zk1oRDdPQnFobzZzeXpJbmtfbi1VbyIsIm9yaWdpbiI6ImFuZHJvaWQ6YXBrLWtleS1oYXNoOk1MTHpEdll4UTRFS1R3QzZVNlpWVnJGUXRIOEdjVi0xZDQ0NEZLOUh2YUkiLCJhbmRyb2lkUGFja2FnZU5hbWUiOiJjb20uZ29vZ2xlLmNyZWRlbnRpYWxtYW5hZ2VyLnNhbXBsZSJ9", - "authenticatorData": "j5r_fLFhV-qdmGEwiukwD5E_5ama9g0hzXgN8thcFGQdAAAAAA", - "signature": "MEUCIQCO1Cm4SA2xiG5FdKDHCJorueiS04wCsqHhiRDbbgITYAIgMKMFirgC2SSFmxrh7z9PzUqr0bK1HZ6Zn8vZVhETnyQ", - "userHandle": "2HzoHm_hY0CjuEESY9tY6-3SdjmNHOoNqaPDcZGzsr0" + "clientDataJSON": "", + "authenticatorData": "", + "signature": "digital_signature_to_be_verified", + "userHandle": "user_id_from_credential_registration" } } // [END android_identity_format_json_response_passkey] @@ -74,40 +74,30 @@ // Json request for creating a passkey // [START android_identity_create_passkey_request_json] { - "challenge": "abc123", + "challenge": "", "rp": { - "name": "Credential Manager example", - "id": "credential-manager-test.example.com" + "name": "", + "id": "" }, "user": { - "id": "def456", - "name": "helloandroid@gmail.com", - "displayName": "helloandroid@gmail.com" + "id": "", + "name": "", + "displayName": "" }, "pubKeyCredParams": [ { "type": "public-key", "alg": -7 - }, - { - "type": "public-key", - "alg": -257 } ], - "timeout": 1800000, "attestation": "none", "excludeCredentials": [ { - "id": "ghi789", - "type": "public-key" - }, - { - "id": "jkl012", - "type": "public-key" + "id": "", + "type": "public-key" } ], "authenticatorSelection": { - "authenticatorAttachment": "platform", "requireResidentKey": true, "residentKey": "required", "userVerification": "required" @@ -129,7 +119,17 @@ } } // [END android_identity_create_passkey_response_json] - } - + }, + { + "SignInJsonRequest": + //Json object sent by server when creating sign-in request + // [START android_identity_create_sign_in_request_json] + { + "challenge": "", + "allowCredentials": [], + "rpId": "" + } + // [END android_identity_create_sign_in_request_json] + } ] } \ No newline at end of file From 232f067343dbb8bf66478d73911cf32acb3064c4 Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 19:20:17 +0530 Subject: [PATCH 12/22] Initialize preferImmediatelyAvailableCredentials --- .../identity/credentialmanager/PasskeyAndPasswordFunctions.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index ee7888eb8..3ff5f04da 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -79,6 +79,7 @@ class PasskeyAndPasswordFunctions( ) // [END android_identity_get_password_passkey_options] var result: GetCredentialResponse + var preferImmediatelyAvailableCredentials: Boolean = false // [START android_identity_get_credential_request] val credentialRequest = GetCredentialRequest( // Include all the sign-in options that your app supports From 5a5dfeb85769aa344cf598d203ad1884311772bb Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 20:32:04 +0530 Subject: [PATCH 13/22] Update PasskeyAndPasswordFunctions.kt --- .../identity/credentialmanager/PasskeyAndPasswordFunctions.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index 3ff5f04da..de1a975fc 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -80,6 +80,7 @@ class PasskeyAndPasswordFunctions( // [END android_identity_get_password_passkey_options] var result: GetCredentialResponse var preferImmediatelyAvailableCredentials: Boolean = false + var isConditionalCreateRequest: Boolean = false // [START android_identity_get_credential_request] val credentialRequest = GetCredentialRequest( // Include all the sign-in options that your app supports @@ -242,7 +243,7 @@ class PasskeyAndPasswordFunctions( // credentials or hybrid credentials. preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials, // Automatically create a passkey if the user does not have one. - isConditionalCreateRequest = true + isConditionalCreateRequest = isConditionalCreateRequest ) // Execute createCredential asynchronously to register credentials From ca3cf2960715016a240a50dcb622e5ce8b7b2c25 Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 22:50:19 +0530 Subject: [PATCH 14/22] Update PasskeyAndPasswordFunctions.kt --- .../identity/credentialmanager/PasskeyAndPasswordFunctions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index de1a975fc..8ee92e494 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -80,7 +80,6 @@ class PasskeyAndPasswordFunctions( // [END android_identity_get_password_passkey_options] var result: GetCredentialResponse var preferImmediatelyAvailableCredentials: Boolean = false - var isConditionalCreateRequest: Boolean = false // [START android_identity_get_credential_request] val credentialRequest = GetCredentialRequest( // Include all the sign-in options that your app supports @@ -236,6 +235,7 @@ class PasskeyAndPasswordFunctions( // [START android_identity_create_passkey] suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) { + var isConditionalCreateRequest: Boolean = false val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest( // Contains the request in JSON format. requestJson = requestJson, From 742cbf30f0c6523e44b99f3000b5bb31d10a8a5c Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 23:21:12 +0530 Subject: [PATCH 15/22] Update libs.versions.toml --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5517bdcc1..3ed980c7b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,8 +12,8 @@ androidx-constraintlayout = "2.2.1" androidx-constraintlayout-compose = "1.1.1" androidx-coordinator-layout = "1.3.0" androidx-corektx = "1.17.0" -androidx-credentials = "1.5.0" -androidx-credentials-play-services-auth = "1.5.0" +androidx-credentials = "1.6.0-beta03" +androidx-credentials-play-services-auth = "1.6.0-beta03" androidx-emoji2-views = "1.6.0" androidx-fragment-ktx = "1.8.9" androidx-glance-appwidget = "1.1.1" From b91c76de204f8fea77ce14b52f0a6ed04f6c7426 Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 23:41:07 +0530 Subject: [PATCH 16/22] Update PasskeyAndPasswordFunctions.kt --- .../credentialmanager/PasskeyAndPasswordFunctions.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index 8ee92e494..f921952e4 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -70,10 +70,10 @@ class PasskeyAndPasswordFunctions( ) { val requestJson = creationResult.toString() // [START android_identity_get_password_passkey_options] - // Get the the password logins from the credential provider on the user's device + // Get password logins from the credential provider on the user's device. val getPasswordOption = GetPasswordOption() - // Get the passkeys from the credential provider on the user's device + // Get passkeys from the credential provider on the user's device. val getPublicKeyCredentialOption = GetPublicKeyCredentialOption( requestJson = requestJson ) @@ -82,7 +82,7 @@ class PasskeyAndPasswordFunctions( var preferImmediatelyAvailableCredentials: Boolean = false // [START android_identity_get_credential_request] val credentialRequest = GetCredentialRequest( - // Include all the sign-in options that your app supports + // Include all the sign-in options that your app supports. listOf(getPasswordOption, getPublicKeyCredentialOption), // Defines whether you prefer to use only immediately available // credentials or hybrid credentials. @@ -235,7 +235,6 @@ class PasskeyAndPasswordFunctions( // [START android_identity_create_passkey] suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) { - var isConditionalCreateRequest: Boolean = false val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest( // Contains the request in JSON format. requestJson = requestJson, @@ -243,7 +242,7 @@ class PasskeyAndPasswordFunctions( // credentials or hybrid credentials. preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials, // Automatically create a passkey if the user does not have one. - isConditionalCreateRequest = isConditionalCreateRequest + isConditionalCreateRequest: Boolean = true ) // Execute createCredential asynchronously to register credentials From 5a17a370837190cfb4253499044b151ef555f121 Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 23:50:09 +0530 Subject: [PATCH 17/22] Update PasskeyAndPasswordFunctions.kt --- .../identity/credentialmanager/PasskeyAndPasswordFunctions.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index f921952e4..63f009f63 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -235,6 +235,7 @@ class PasskeyAndPasswordFunctions( // [START android_identity_create_passkey] suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) { + var isConditionalCreateRequest: Boolean = false val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest( // Contains the request in JSON format. requestJson = requestJson, @@ -242,7 +243,7 @@ class PasskeyAndPasswordFunctions( // credentials or hybrid credentials. preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials, // Automatically create a passkey if the user does not have one. - isConditionalCreateRequest: Boolean = true + isConditionalCreateRequest: isConditionalCreateRequest ) // Execute createCredential asynchronously to register credentials From 3f4ef2112e541660ba90276af7fdf9e1d23ee14a Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Wed, 22 Oct 2025 23:56:13 +0530 Subject: [PATCH 18/22] Update PasskeyAndPasswordFunctions.kt --- .../identity/credentialmanager/PasskeyAndPasswordFunctions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index 63f009f63..f190c1d9e 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -243,7 +243,7 @@ class PasskeyAndPasswordFunctions( // credentials or hybrid credentials. preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials, // Automatically create a passkey if the user does not have one. - isConditionalCreateRequest: isConditionalCreateRequest + isConditionalCreateRequest = isConditionalCreateRequest ) // Execute createCredential asynchronously to register credentials From 0c6812f70c5d0d7040d8a7e4b4da4862cb334d34 Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Thu, 23 Oct 2025 00:07:40 +0530 Subject: [PATCH 19/22] Update PasskeyAndPasswordFunctions.kt --- .../identity/credentialmanager/PasskeyAndPasswordFunctions.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt index f190c1d9e..60ab33d2c 100644 --- a/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt +++ b/identity/credentialmanager/src/main/java/com/example/identity/credentialmanager/PasskeyAndPasswordFunctions.kt @@ -235,7 +235,7 @@ class PasskeyAndPasswordFunctions( // [START android_identity_create_passkey] suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) { - var isConditionalCreateRequest: Boolean = false + var isConditional: Boolean = false val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest( // Contains the request in JSON format. requestJson = requestJson, @@ -243,7 +243,7 @@ class PasskeyAndPasswordFunctions( // credentials or hybrid credentials. preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials, // Automatically create a passkey if the user does not have one. - isConditionalCreateRequest = isConditionalCreateRequest + isConditional = isConditional ) // Execute createCredential asynchronously to register credentials From f08488006d1e8107105b622c6c646c542c6bfa1c Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Thu, 23 Oct 2025 00:41:04 +0530 Subject: [PATCH 20/22] Update jsonSnippets.json --- identity/credentialmanager/src/main/jsonSnippets.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/identity/credentialmanager/src/main/jsonSnippets.json b/identity/credentialmanager/src/main/jsonSnippets.json index 694dee285..d583d2c2d 100644 --- a/identity/credentialmanager/src/main/jsonSnippets.json +++ b/identity/credentialmanager/src/main/jsonSnippets.json @@ -110,13 +110,14 @@ // Json response when creating a passkey // [START android_identity_create_passkey_response_json] { - "id": "KEDetxZcUfinhVi6Za5nZQ", + "id": "", "type": "public-key", - "rawId": "KEDetxZcUfinhVi6Za5nZQ", + "rawId": "", "response": { - "clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoibmhrUVhmRTU5SmI5N1Z5eU5Ka3ZEaVh1Y01Fdmx0ZHV2Y3JEbUdyT0RIWSIsIm9yaWdpbiI6ImFuZHJvaWQ6YXBrLWtleS1oYXNoOk1MTHpEdll4UTRFS1R3QzZVNlpWVnJGUXRIOEdjVi0xZDQ0NEZLOUh2YUkiLCJhbmRyb2lkUGFja2FnZU5hbWUiOiJjb20uZ29vZ2xlLmNyZWRlbnRpYWxtYW5hZ2VyLnNhbXBsZSJ9", - "attestationObject": "o2NmbXRkbm9uZWdhdHRTdG10oGhhdXRoRGF0YViUj5r_fLFhV-qdmGEwiukwD5E_5ama9g0hzXgN8thcFGRdAAAAAAAAAAAAAAAAAAAAAAAAAAAAEChA3rcWXFH4p4VYumWuZ2WlAQIDJiABIVgg4RqZaJyaC24Pf4tT-8ONIZ5_Elddf3dNotGOx81jj3siWCAWXS6Lz70hvC2g8hwoLllOwlsbYatNkO2uYFO-eJID6A" - } + "clientDataJSON": "", + "attestationObject": "" + }, + "authenticatorAttachment": "platform" } // [END android_identity_create_passkey_response_json] }, From 44e83bb164e52aae881dce159a2231ebd3c72e47 Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Thu, 23 Oct 2025 11:57:43 +0530 Subject: [PATCH 21/22] Update jsonSnippets.json --- identity/credentialmanager/src/main/jsonSnippets.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/identity/credentialmanager/src/main/jsonSnippets.json b/identity/credentialmanager/src/main/jsonSnippets.json index d583d2c2d..abdece698 100644 --- a/identity/credentialmanager/src/main/jsonSnippets.json +++ b/identity/credentialmanager/src/main/jsonSnippets.json @@ -63,8 +63,8 @@ "response": { "clientDataJSON": "", "authenticatorData": "", - "signature": "digital_signature_to_be_verified", - "userHandle": "user_id_from_credential_registration" + "signature": "", + "userHandle": "" } } // [END android_identity_format_json_response_passkey] From b93d630570e3b5b08b170f6547e98220c83a9463 Mon Sep 17 00:00:00 2001 From: vinishavathwani Date: Thu, 23 Oct 2025 12:02:24 +0530 Subject: [PATCH 22/22] Update jsonSnippets.json --- identity/credentialmanager/src/main/jsonSnippets.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/identity/credentialmanager/src/main/jsonSnippets.json b/identity/credentialmanager/src/main/jsonSnippets.json index 72282c37c..bdf7a0f07 100644 --- a/identity/credentialmanager/src/main/jsonSnippets.json +++ b/identity/credentialmanager/src/main/jsonSnippets.json @@ -30,7 +30,7 @@ "namespace": "android_app", "package_name": "com.example.android", "sha256_cert_fingerprints": [ - SHA_HEX_VALUE + "" ] } } @@ -126,7 +126,7 @@ //Json object sent by server when creating sign-in request // [START android_identity_create_sign_in_request_json] { - "challenge": "", + "challenge": "", "allowCredentials": [], "rpId": "" }