इस गाइड में, पुष्टि करने के लिए पासकी इस्तेमाल करने के बारे में बताया गया है. उपयोगकर्ताओं को पासकी की मदद से साइन इन करने की सुविधा देने से पहले, आपको पासकी बनाना लेख में दिए गए निर्देशों का पालन करना होगा.
पासकी की मदद से पुष्टि करने के लिए, आपको सबसे पहले उन विकल्पों को वापस पाना होगा जिनकी ज़रूरत ऐप्लिकेशन सर्वर से सार्वजनिक पासकोड को वापस पाने के लिए होती है. इसके बाद, सार्वजनिक पासकोड को वापस पाने के लिए, Credential Manager API को कॉल करें. इसके बाद, साइन-इन करने के अनुरोध पर मिली प्रतिक्रिया को सही तरीके से मैनेज करें.
खास जानकारी
इस गाइड में, क्लाइंट ऐप्लिकेशन में किए जाने वाले उन बदलावों के बारे में बताया गया है जिनकी मदद से, पासकी का इस्तेमाल करके उपयोगकर्ता को साइन इन किया जा सकता है. साथ ही, इसमें ऐप्लिकेशन के सर्वर साइड पर लागू करने के बारे में खास जानकारी दी गई है. सर्वर-साइड इंटिग्रेशन के बारे में ज़्यादा जानने के लिए, सर्वर-साइड पासकी की पुष्टि लेख पढ़ें.
उपयोगकर्ता के खाते से जुड़ी सभी पासकी और पासवर्ड के विकल्प वापस पाने के लिए, यह तरीका अपनाएं:
- सर्वर से क्रेडेंशियल के अनुरोध के विकल्प पाना: पासकी की मदद से साइन इन करने की प्रोसेस शुरू करने के लिए, अपने ऐप्लिकेशन से ऑथेंटिकेशन सर्वर को अनुरोध भेजें. सर्वर से, सार्वजनिक पासकोड क्रेडेंशियल पाने के लिए ज़रूरी विकल्प और एक यूनीक चैलेंज भेजें.
- सार्वजनिक पासकोड क्रेडेंशियल पाने के लिए ज़रूरी ऑब्जेक्ट बनाएं: सर्वर से भेजे गए विकल्पों को
GetPublicKeyCredentialOptionऑब्जेक्ट में रैप करें - (ज़रूरी नहीं) getCredential तैयार करें: Android 14 और इसके बाद के वर्शन में,
getCredential()को कॉल करने से पहलेprepareGetCredential()तरीके का इस्तेमाल करके, खाता चुनने वाला टूल दिखाया जा सकता है. इससे, पुष्टि में लगने वाला समय कम हो जाता है. - साइन इन करने का फ़्लो लॉन्च करना: उपयोगकर्ता को साइन इन करने के लिए,
getCredential()तरीके को कॉल करें - जवाब मैनेज करना: क्रेडेंशियल से जुड़े हर संभावित जवाब को मैनेज करें.
- अपवादों को मैनेज करना: पक्का करें कि आपने अपवादों को सही तरीके से मैनेज किया हो.
1. सर्वर से क्रेडेंशियल के अनुरोध के विकल्प पाना
सर्वर से, सार्वजनिक कुंजी के क्रेडेंशियल पाने के लिए ज़रूरी विकल्पों का अनुरोध करें. साथ ही, challenge का अनुरोध करें. यह हर बार साइन इन करने के लिए यूनीक होता है. सर्वर-साइड पर लागू करने के बारे में ज़्यादा जानने के लिए, चैलेंज बनाना और क्रेडेंशियल के अनुरोध के विकल्प बनाना लेख पढ़ें.
ये विकल्प कुछ इस तरह दिखते हैं:
{
"challenge": "<your app challenge>",
"allowCredentials": [],
"rpId": "<your app server domain>"
}
फ़ील्ड के बारे में ज़्यादा जानने के लिए, पासकी से साइन इन करने के बारे में ब्लॉग पोस्ट पढ़ें.
2. सार्वजनिक पासकोड क्रेडेंशियल पाने के लिए ज़रूरी ऑब्जेक्ट बनाना
अपने ऐप्लिकेशन में, 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
)
3. ज़रूरी नहीं: साइन-इन में लगने वाला समय कम करना
Android 14 या इसके बाद के वर्शन पर, खाता चुनने वाला टूल दिखाते समय लेटेन्सी कम की जा सकती है. इसके लिए, getCredential() को कॉल करने से पहले, prepareGetCredential() तरीके का इस्तेमाल करें.
prepareGetCredential() वाला तरीका, PrepareGetCredentialResponse ऑब्जेक्ट दिखाता है. यह ऑब्जेक्ट कैश मेमोरी में सेव होता है. इससे अगले चरण में मौजूद getCredential() तरीके को, कैश मेमोरी में सेव किए गए डेटा के साथ खाता चुनने वाला टूल दिखाने की अनुमति मिलती है.
coroutineScope {
val response = credentialManager.prepareGetCredential(
GetCredentialRequest(
listOf(
// Include all the sign-in options that your app supports
getPublicKeyCredentialOption,
getPasswordOption
)
)
)
}
4. साइन-इन फ़्लो लॉन्च करना
उपयोगकर्ता को खाता चुनने वाला टूल दिखाने के लिए, getCredential() तरीके को कॉल करें. साइन-इन फ़्लो लॉन्च करने के तरीके के बारे में जानने के लिए, इस कोड स्निपेट का इस्तेमाल करें:
coroutineScope {
try {
result = credentialManager.getCredential(
// Use an activity-based context to avoid undefined system UI
// launching behavior.
context = activityContext,
request = credentialRequest
)
handleSignIn(result)
} catch (e: GetCredentialException) {
// Handle failure
}
}
5. जवाब मैनेज करना
रिस्पॉन्स को मैनेज करें. इसमें अलग-अलग तरह के क्रेडेंशियल ऑब्जेक्ट शामिल हो सकते हैं.
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>"
}
}
सर्वर पर, आपको क्रेडेंशियल की पुष्टि करनी होगी. ज़्यादा जानने के लिए, उपयोगकर्ता की पुष्टि करना और उसे साइन इन करना लेख पढ़ें.
6. अपवादों को मैनेज करना
आपको GetCredentialException की सभी सबक्लास से जुड़ी समस्याओं को ठीक करना होगा.
हर अपवाद को मैनेज करने का तरीका जानने के लिए, समस्या हल करने की गाइड देखें.
coroutineScope {
try {
result = credentialManager.getCredential(
context = activityContext,
request = credentialRequest
)
} catch (e: GetCredentialException) {
Log.e("CredentialManager", "No credential available", e)
}
}