पासकी से साइन इन करना

यह गाइड, पुष्टि करने के लिए पासकी का इस्तेमाल करने के तरीके को लागू करने के बारे में है. उपयोगकर्ताओं के पासकी से साइन इन करने से पहले, आपको पासकी बनाना लेख में दिए गए निर्देशों को भी पूरा करना होगा.

पासकी से पुष्टि करने के लिए, आपको सबसे पहले अपने ऐप्लिकेशन सर्वर से सार्वजनिक पासकोड पाने के लिए ज़रूरी विकल्प वापस पाने होंगे. इसके बाद, सार्वजनिक पासकोड पाने के लिए, क्रेडेंशियल मैनेजर एपीआई को कॉल करना होगा. इसके बाद, साइन-इन के जवाब को सही तरीके से मैनेज करें.

खास जानकारी

इस गाइड में, क्लाइंट ऐप्लिकेशन में किए जाने वाले उन बदलावों के बारे में बताया गया है जिनकी मदद से, उपयोगकर्ता पासकी का इस्तेमाल करके साइन इन कर सकते हैं. साथ ही, इसमें ऐप्लिकेशन सर्वर-साइड के लागू करने के तरीके की खास जानकारी भी दी गई है. सर्वर-साइड इंटिग्रेशन के बारे में ज़्यादा जानने के लिए, सर्वर-साइड पासकी ऑथेंटिकेशन लेख पढ़ें.

उपयोगकर्ता के खाते से जुड़ी सभी पासकी और पासवर्ड के विकल्प वापस पाने के लिए, यह तरीका अपनाएं:

  1. सर्वर से क्रेडेंशियल के अनुरोध के विकल्प पाना: पासकी से साइन-इन करने की प्रोसेस शुरू करने के लिए, अपने ऐप्लिकेशन से ऑथेंटिकेशन सर्वर को अनुरोध भेजें. सर्वर से, सार्वजनिक पासकोड क्रेडेंशियल पाने के लिए ज़रूरी विकल्प और एक यूनीक चैलेंज भेजें.
  2. सार्वजनिक पासकोड क्रेडेंशियल पाने के लिए ज़रूरी ऑब्जेक्ट बनाना: सर्वर से भेजे गए विकल्पों को ऑब्जेक्ट में रैप करेंGetPublicKeyCredentialOption
  3. (ज़रूरी नहीं) getCredential तैयार करना: Android 14 और इसके बाद के वर्शन में, आप खाता चुनने वाला टूल दिखाकर, इंतज़ार का समय कम कर सकते हैं. इसके लिए, prepareGetCredential() तरीके का इस्तेमाल करें. यह तरीका, getCredential() को कॉल करने से पहले इस्तेमाल किया जाता है.
  4. साइन-इन का फ़्लो लॉन्च करना: उपयोगकर्ता को साइन इन करने के लिए, getCredential() तरीके को कॉल करें
  5. जवाब मैनेज करना: क्रेडेंशियल के हर संभावित जवाब को मैनेज करें.
  6. गड़बड़ियों को ठीक करना: पक्का करें कि आपने गड़बड़ियों को सही तरीके से ठीक किया हो.

सर्वर से क्रेडेंशियल के अनुरोध के विकल्प पाना

सार्वजनिक पासकोड क्रेडेंशियल पाने के लिए ज़रूरी विकल्पों के साथ-साथ, सर्वर से challenge का अनुरोध करें. यह हर बार साइन-इन करने की कोशिश के लिए यूनीक होता है. सर्वर-साइड के लागू करने के तरीके के बारे में ज़्यादा जानने के लिए, चैलेंज बनाना और क्रेडेंशियल के अनुरोध के विकल्प बनाना लेख पढ़ें.

ये विकल्प, इस तरह दिखते हैं:

{
  "challenge": "<your app challenge>",
  "allowCredentials": [],
  "rpId": "<your app server domain>"
}

फ़ीड के बारे में ज़्यादा जानने के लिए, पासकी से साइन इन करना लेख पढ़ें.

सार्वजनिक पासकोड क्रेडेंशियल पाने के लिए ज़रूरी ऑब्जेक्ट बनाना

अपने ऐप्लिकेशन में, GetPublicKeyCredentialOption ऑब्जेक्ट बनाने के लिए, विकल्पों का इस्तेमाल करें. यहां दिए गए उदाहरण में, requestJson सर्वर से भेजे गए विकल्पों को दिखाता है.

// Get password logins from the credential provider on the user's device.
val getPasswordOption = GetPasswordOption()

// Get passkeys from the credential provider on the user's device.
val getPublicKeyCredentialOption = GetPublicKeyCredentialOption(
    requestJson = requestJson
)

इसके बाद, GetPublicKeyCredentialOption को GetCredentialRequest ऑब्जेक्ट में रैप करें.

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
)

ज़रूरी नहीं: साइन-इन में लगने वाला समय कम करना

Android 14 या इसके बाद के वर्शन पर, खाता चुनने वाला टूल दिखाते समय, इंतज़ार का समय कम किया जा सकता है. इसके लिए, prepareGetCredential() तरीके का इस्तेमाल करें. इसे getCredential() को कॉल करने से पहले इस्तेमाल करें.

The prepareGetCredential() तरीका, PrepareGetCredentialResponse ऑब्जेक्ट दिखाता है, जिसे कैश किया जाता है. इससे, अगले चरण में getCredential() तरीका, कैश किए गए डेटा के साथ खाता चुनने वाला टूल दिखाता है.

coroutineScope {
    val response = credentialManager.prepareGetCredential(
        GetCredentialRequest(
            listOf(
                // Include all the sign-in options that your app supports
                getPublicKeyCredentialOption, 
                getPasswordOption
            )
        )
    )
}

साइन-इन का फ़्लो लॉन्च करना

उपयोगकर्ता को खाता चुनने वाला टूल दिखाने के लिए, getCredential() तरीके को कॉल करें. साइन-इन का फ़्लो लॉन्च करने के तरीके के बारे में जानकारी पाने के लिए, कोड का यह स्निपेट देखें:

// Use an activity-based context to avoid undefined system UI
// launching behavior.
val context = MutableContextWrapper(activityContext)
coroutineScope {
    try {
        result = credentialManager.getCredential(
            // Use MutableContextWrapper to avoid memory leak during configuration changes
            context = context,
            request = credentialRequest
        )
        handleSignIn(result)
    } catch (e: GetCredentialException) {
        // Handle failure
    }
}

जवाब मैनेज करना

जवाब को मैनेज करें. इसमें अलग-अलग तरह के क्रेडेंशियल ऑब्जेक्ट शामिल हो सकते हैं.

fun handleSignIn(result: GetCredentialResponse) {
    // Handle the successfully returned credential.
    val credential = result.credential

    when (credential) {
        is PublicKeyCredential -> {
            val responseJson = credential.authenticationResponseJson
            // Share responseJson i.e. a GetCredentialResponse on your server to
            // validate and  authenticate
        }

        is PasswordCredential -> {
            val username = credential.id
            val password = credential.password
            // Use id and password to send to your server to validate
            // and authenticate
        }

        is CustomCredential -> {
            // If you are also using any external sign-in libraries, parse them
            // here with the utility functions provided.
            if (credential.type == ExampleCustomCredential.TYPE) {
                try {
                    val ExampleCustomCredential =
                        ExampleCustomCredential.createFrom(credential.data)
                    // Extract the required credentials and complete the authentication as per
                    // the federated sign in or any external sign in library flow
                } catch (e: ExampleCustomCredential.ExampleCustomCredentialParsingException) {
                    // Unlikely to happen. If it does, you likely need to update the dependency
                    // version of your external sign-in library.
                    Log.e(TAG, "Failed to parse an ExampleCustomCredential", e)
                }
            } else {
                // Catch any unrecognized custom credential type here.
                Log.e(TAG, "Unexpected type of credential")
            }
        }
        else -> {
            // Catch any unrecognized credential type here.
            Log.e(TAG, "Unexpected type of credential")
        }
    }
}

पुष्टि करने के बाद मिलने वाला PublicKeyCredential, असल में एक साइन किया गया दावा होता है. इसका स्ट्रक्चर इस तरह होता है:

{
  "id": "<credential ID>",
  "type": "public-key",
  "rawId": "<raw credential ID>",
  "response": {
    "clientDataJSON": "<signed client data containing challenge>",
    "authenticatorData": "<authenticator metadata>",
    "signature": "<digital signature to be verified>",
    "userHandle": "<user ID from credential registration>"
  }
}

सर्वर पर, आपको क्रेडेंशियल की पुष्टि करनी होगी. ज़्यादा जानने के लिए, उपयोगकर्ता की पुष्टि करना और उसे साइन इन कराना लेख पढ़ें.

गड़बड़ियों को ठीक करना

आपको GetCredentialException के सभी सबक्लास अपवादों को ठीक करना चाहिए. हर अपवाद को ठीक करने का तरीका जानने के लिए, समस्या हल करने की गाइड देखें.

coroutineScope {
    try {
        result = credentialManager.getCredential(
            context = activityContext,
            request = credentialRequest
        )
    } catch (e: GetCredentialException) {
        Log.e("CredentialManager", "No credential available", e)
    }
}

अगले चरण