अपने Android ऐप्लिकेशन में, Credential Manager API का इस्तेमाल करके पुष्टि करने की प्रोसेस को आसान बनाने का तरीका जानें

1. शुरू करने से पहले

पुष्टि करने के पारंपरिक तरीकों से, सुरक्षा और उसे इस्तेमाल करने में कई तरह की चुनौतियां आती हैं.

पासवर्ड बड़े पैमाने पर इस्तेमाल होते हैं, लेकिन...

  • आसानी से याद नहीं
  • मज़बूत पासवर्ड बनाने के लिए, उपयोगकर्ताओं को जानकारी होनी चाहिए.
  • हमलावरों की फ़िशिंग करने, कटाई करने, और उन्हें फिर से चलाने में आसान.

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

क्रेडेंशियल मैनेजर, पासकी के साथ काम करने की सुविधा देता है. साथ ही, इसे पुष्टि करने के पारंपरिक तरीकों, जैसे कि पासवर्ड, Google से साइन इन करें वगैरह के साथ इस्तेमाल किया जा सकता है.

लोग पासकी बना पाएंगे और उन्हें Google Password Manager में सेव कर पाएंगे. इसके बाद, वे इन पासकी को उन Android डिवाइसों पर सिंक कर पाएंगे जिनमें उपयोगकर्ता ने साइन इन किया हुआ है. उपयोगकर्ता के लिए साइन इन करने से पहले, पासकी बनानी होगी और उसे उपयोगकर्ता खाते से जोड़ना होगा. साथ ही, उसकी सार्वजनिक कुंजी को सर्वर पर सेव करना होगा.

इस कोडलैब में, आपको क्रेडेंशियल मैनेजर एपीआई की मदद से पासकी और पासवर्ड की मदद से साइन अप करने का तरीका पता चलेगा. साथ ही, यह जानकारी भी मिलेगी कि आने वाले समय में पुष्टि करने के लिए इनका इस्तेमाल कैसे किया जा सकता है. ये दो फ़्लो होते हैं:

  • साइन अप करें : पासकी और पासवर्ड का इस्तेमाल करके.
  • साइन इन करें : पासकी का इस्तेमाल करके & सेव किया गया पासवर्ड.

ज़रूरी शर्तें

  • Android Studio में ऐप्लिकेशन चलाने के तरीके के बारे में बुनियादी जानकारी.
  • Android ऐप्लिकेशन में पुष्टि करने के फ़्लो की बुनियादी जानकारी.
  • पासकी के बारे में सामान्य जानकारी.

आप इन चीज़ों के बारे में जानेंगे

  • पासकी बनाने का तरीका.
  • Password Manager में पासवर्ड सेव करने का तरीका.
  • पासकी या सेव किए गए पासवर्ड की मदद से, उपयोगकर्ताओं की पुष्टि करने का तरीका.

आपको इनकी ज़रूरत होगी

नीचे दिए गए डिवाइस के कॉम्बिनेशन में से कोई एक:

  • ऐसा Android डिवाइस जो Android 9 या इसके बाद के वर्शन (पासकी के लिए) और Android 4.4 या उसके बाद के वर्शन(क्रेडेंशियल मैनेजर एपीआई के ज़रिए पासवर्ड की पुष्टि करने के लिए) पर चलता है.
  • हो सकता है कि डिवाइस बायोमेट्रिक सेंसर वाला हो.
  • पक्का करें कि आपने बायोमेट्रिक (या स्क्रीन लॉक) रजिस्टर किया हो.
  • Kotlin प्लगिन का वर्शन : 1.8.10

2. सेट अप करें

  1. credman_codelab ब्रांच से, अपने लैपटॉप पर इस रेपो का क्लोन बनाएं : https://github.com/android/identity-samples/tree/credman_codelab
  2. CredentialManager मॉड्यूल पर जाएं और प्रोजेक्ट को Android Studio में खोलें.

आइए, देखते हैं कि ऐप्लिकेशन का शुरुआती स्टेटस क्या है

ऐप्लिकेशन की शुरुआती स्थिति कैसे काम करती है, यह देखने के लिए यह तरीका अपनाएं:

  1. ऐप्लिकेशन लॉन्च करें.
  2. आपको एक मुख्य स्क्रीन पर 'साइन अप और साइन इन करें' बटन दिख रहा है.
  3. 'साइन अप करें' पर क्लिक करके, पासकी या पासवर्ड का इस्तेमाल करके साइन अप किया जा सकता है.
  4. 'साइन इन करें' पर क्लिक करके साइन इन करें. इसके लिए, पासकी और सेव किया गया पासवर्ड.

8c0019ff9011950a.jpeg

यह जानने के लिए कि पासकी क्या होती हैं और ये कैसे काम करती हैं, पासकी कैसे काम करती हैं? सेक्शन देखें .

3. पासकी का इस्तेमाल करके साइन अप करने की सुविधा जोड़ें

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

अब आपको एक पासकी बनानी होगी और बायोमेट्रिक्स/स्क्रीन लॉक की मदद से उपयोगकर्ता के क्रेडेंशियल रजिस्टर करने होंगे.

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

क्रेडेंशियल मैनेजर के अंदर -> ऐप्लिकेशन -> मुख्य -> java -> साइन अप फ़्रैगमेंट.kt, आपको "उपयोगकर्ता नाम" टेक्स्ट फ़ील्ड दिख सकता है साथ ही, पासकी से साइन अप करने के लिए एक बटन भी दिखेगा.

dcc5c529b310f2fb.jpeg

createPasskey() कॉल के लिए चैलेंज और अन्य json रिस्पॉन्स को पास करें

पासकी बनाने से पहले, आपको createCredential() कॉल के दौरान Credential Manager API को पास करने के लिए, सर्वर से ज़रूरी जानकारी पाने का अनुरोध करना होगा.

अच्छी बात यह है कि आपकी ऐसेट(RegFromServer.txt) में पहले से ही मॉक रिस्पॉन्स मौजूद है. इससे कोडलैब में ऐसे पैरामीटर दिखते हैं.

  • अपने ऐप्लिकेशन में, SignUpFragment.kt ढूंढें, signUpWithPasskeys तरीका ढूंढें. यहां आपको पासकी बनाने और उपयोगकर्ता को साइन इन करने की अनुमति देने के लिए लॉजिक लिखना है. आपको यह तरीका एक ही क्लास में मिल सकता है.
  • createPasskey() को कॉल करने के लिए टिप्पणी वाले अन्य ब्लॉक को चेक करें और निम्न कोड से बदलें :

SignUpFragment.kt

//TODO : Call createPasskey() to signup with passkey

val data = createPasskey()

स्क्रीन पर मान्य उपयोगकर्ता नाम डालने के बाद, यह तरीका इस्तेमाल किया जाएगा.

  • createPasskey() तरीके के अंदर, आपको लौटाए गए ज़रूरी पैरामीटर के साथ CreatePublicKeyCredentialRequest() बनाना होगा.

SignUpFragment.kt

//TODO create a CreatePublicKeyCredentialRequest() with necessary registration json from server

val request = CreatePublicKeyCredentialRequest(fetchRegistrationJsonFromServer())

यहकुत्ते के लिए फ़ेच-रजिस्ट्रेशनJsonFromServer() ऐसा तरीका है जो ऐसेट से, रजिस्ट्रेशन json रिस्पॉन्स को पढ़ता है. साथ ही, पासकी बनाते समय पास किया जाने वाला रजिस्ट्रेशन json दिखाता है.

  • फ़ेच रजिस्ट्रेशनJsonFromServer() तरीका ढूंढें और json पाने के लिए, TODO को नीचे दिए गए कोड से बदलें. साथ ही, खाली स्ट्रिंग लौटाए गए स्टेटमेंट को भी हटाएं :

SignUpFragment.kt

//TODO fetch registration mock response

val response = requireContext().readFromAsset("RegFromServer")

//Update userId,challenge, name and Display name in the mock
return response.replace("<userId>", getEncodedUserId())
   .replace("<userName>", binding.username.text.toString())
   .replace("<userDisplayName>", binding.username.text.toString())
   .replace("<challenge>", getEncodedChallenge())
  • यहां, आपने ऐसेट में मौजूद रजिस्ट्रेशन json को पढ़ा है.
  • इस JSON में मौजूद चार फ़ील्ड को बदलना है.
  • User-ID यूनीक होना चाहिए, ताकि उपयोगकर्ता एक से ज़्यादा पासकी बना सके (ज़रूरी होने पर). आपने <userId> को बदल दिया जनरेट किए गए यूज़र आईडी से.
  • &lt;challenge&gt; का भी यूनीक होना ज़रूरी है, ताकि आपके पास कोई रैंडम यूनीक चैलेंज जनरेट करने का विकल्प हो. यह तरीका आपके कोड में पहले से मौजूद है.

नीचे दिए गए कोड स्निपेट में, सैंपल के तौर पर दिए गए विकल्प शामिल हैं. ये विकल्प आपको सर्वर से मिलते हैं:

{
  "challenge": String,
  "rp": {
    "name": String,
    "id": String
  },
  "user": {
    "id": String,
    "name": String,
    "displayName": String
  },
  "pubKeyCredParams": [
    {
      "type": "public-key",
      "alg": -7
    },
    {
      "type": "public-key",
      "alg": -257
    }
  ],
  "timeout": 1800000,
  "attestation": "none",
  "excludeCredentials": [],
  "authenticatorSelection": {
    "authenticatorAttachment": "platform",
    "requireResidentKey": true,
    "residentKey": "required",
    "userVerification": "required"
  }
}

यह टेबल पूरी नहीं है, लेकिन इसमें PublicKeyCredentialCreationOptions डिक्शनरी में मौजूद ज़रूरी पैरामीटर शामिल हैं:

पैरामीटर

जानकारी

challenge

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

user.id

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

user.name

इस फ़ील्ड में उस खाते का यूनीक आइडेंटिफ़ायर होना चाहिए जिसे उपयोगकर्ता पहचानता है. जैसे, ईमेल पता या उपयोगकर्ता नाम. यह नाम, खाता चुनने वाले टूल में दिखेगा. (अगर उपयोगकर्ता नाम का इस्तेमाल किया जा रहा है, तो उसी वैल्यू का इस्तेमाल करें जो पासवर्ड की पुष्टि करने के लिए इस्तेमाल किया जाता है.)

user.displayName

यह फ़ील्ड खाते के लिए एक वैकल्पिक और ज़्यादा उपयोगकर्ता के लिए आसान नाम है. यह उपयोगकर्ता खाते का ऐसा नाम है जिसे कोई भी व्यक्ति आसानी से समझ सकता है. इसे सिर्फ़ दिखाने के लिए बनाया गया है.

rp.id

भरोसेमंद पार्टी की इकाई आपके आवेदन की जानकारी से मेल खाती है.इसके लिए यह ज़रूरी है :

  • नाम (ज़रूरी है): आपके ऐप्लिकेशन का नाम
  • आईडी (ज़रूरी नहीं): डोमेन या सबडोमेन से जुड़ा हो. अगर यह नहीं है, तो मौजूदा डोमेन का इस्तेमाल किया जाता है.
  • आइकॉन (ज़रूरी नहीं).

pubKeyCredParams

सार्वजनिक पासकोड क्रेडेंशियल पैरामीटर, मंज़ूर किए गए एल्गोरिदम और कुंजी टाइप की एक सूची है. इस सूची में कम से कम एक एलिमेंट होना चाहिए.

excludeCredentials

डिवाइस को रजिस्टर करने वाले उपयोगकर्ता ने शायद अन्य डिवाइस रजिस्टर किए हों. अगर आपको किसी एक पुष्टि करने वाले पर एक ही खाते के लिए, एक से ज़्यादा क्रेडेंशियल बनाने की अनुमति नहीं है, तो इन डिवाइसों को अनदेखा किया जा सकता है. अगर ट्रांसपोर्ट सदस्य दिया गया है, तो उसमें हर क्रेडेंशियल के रजिस्ट्रेशन के दौरान getTransports() को कॉल करने का नतीजा शामिल होना चाहिए.

authenticatorSelection.authenticatorAttachment

यह बताता है कि डिवाइस को प्लैटफ़ॉर्म पर अटैच किया जाना चाहिए या नहीं या इसकी कोई ज़रूरत नहीं है. इसे "प्लैटफ़ॉर्म" पर सेट करें. इससे पता चलता है कि हमें प्लैटफ़ॉर्म डिवाइस में एम्बेड किए गए Authenticator की ज़रूरत है. साथ ही, उपयोगकर्ता को कोई पुष्टि करने के लिए नहीं कहा जाएगा, जैसे कि शामिल हैं.

residentKey

"ज़रूरी" वैल्यू के बारे में बताएं पासकी बनाने के लिए.

क्रेडेंशियल बनाना

  1. CreatePublicKeyCredentialRequest() बनाने के बाद, आपको बनाए गए अनुरोध के साथ createCredential() कॉल को कॉल करना होगा.

SignUpFragment.kt

//TODO call createCredential() with createPublicKeyCredentialRequest

try {
   response = credentialManager.createCredential(
       requireActivity(),
       request
   ) as CreatePublicKeyCredentialResponse
} catch (e: CreateCredentialException) {
   configureProgress(View.INVISIBLE)
   handlePasskeyFailure(e)
}
  • बनाने के लिए ज़रूरी जानकारी पास करें.
  • अनुरोध स्वीकार होने के बाद, आपको अपनी स्क्रीन पर एक बॉटमशीट दिखेगी. इसमें आपको पासकी बनाने के लिए कहा जाएगा.
  • अब उपयोगकर्ता बायोमेट्रिक्स या स्क्रीन लॉक वगैरह से अपनी पहचान की पुष्टि कर सकते हैं.
  • रेंडर किए गए व्यू के दिखने की सेटिंग मैनेज की जा सकती है. साथ ही, किसी वजह से अनुरोध पूरा नहीं होने या न होने पर, अपवादों को हैंडल किया जा सकता है. यहां गड़बड़ी के मैसेज लॉग किए जाते हैं और गड़बड़ी के डायलॉग में ऐप्लिकेशन में दिखाए जाते हैं. Android Studio या adb डीबग निर्देश की मदद से, गड़बड़ी के पूरे लॉग देखे जा सकते हैं

93022cb87c00f1fc.png

  1. अब आपको रजिस्ट्रेशन की प्रक्रिया पूरी करनी होगी. इसके लिए, आपको सर्वर पर सार्वजनिक पासकोड का क्रेडेंशियल भेजना होगा और उपयोगकर्ता को साइन इन करने की अनुमति देनी होगी. ऐप्लिकेशन को एक क्रेडेंशियल ऑब्जेक्ट मिलता है, जिसमें एक सार्वजनिक कुंजी होती है. पासकी को रजिस्टर करने के लिए, इसे सर्वर पर भेजा जा सकता है.

यहां हमने एक मॉक सर्वर का इस्तेमाल किया है. इसलिए, हम यह बताते हुए 'सही' दिखाते हैं कि सर्वर ने रजिस्टर की गई सार्वजनिक कुंजी को आने वाले समय में पुष्टि और पुष्टि करने के लिए सेव कर लिया है.

signUpWithPasskeys() तरीके के अंदर, काम की टिप्पणी ढूंढें और उसे इस कोड से बदलें:

SignUpFragment.kt

//TODO : complete the registration process after sending public key credential to your server and let the user in

data?.let {
   registerResponse()
   DataProvider.setSignedInThroughPasskeys(true)
   listener.showHome()
}
  • recordResponse सही तरीके से दिखाता है, जिससे पता चलता है कि (मॉक) सर्वर ने सार्वजनिक कुंजी को आने वाले समय में इस्तेमाल करने के लिए सेव कर लिया है.
  • आपने SignedInथ्रूPasskeys फ़्लैग को 'सही है' के तौर पर सेट किया है. इससे पता चलता है कि आपने पासकी से लॉग इन किया है.
  • लॉग इन करने के बाद, उपयोगकर्ता को होम स्क्रीन पर रीडायरेक्ट किया जाता है.

नीचे दिए गए कोड स्निपेट में उदाहरण के तौर पर एक विकल्प दिया गया है, जो आपको मिलने चाहिए:

{
  "id": String,
  "rawId": String,
  "type": "public-key",
  "response": {
    "clientDataJSON": String,
    "attestationObject": String,
  }
}

यह टेबल पूरी नहीं है, लेकिन इसमें PublicKeyCredential के अहम पैरामीटर शामिल हैं:

पैरामीटर

जानकारी

id

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

rawId

क्रेडेंशियल आईडी का ArrayBuffer ऑब्जेक्ट वर्शन.

response.clientDataJSON

ArrayBuffer ऑब्जेक्ट, कोड में बदला गया क्लाइंट डेटा.

response.attestationObject

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

ऐप्लिकेशन चलाएं. इसके बाद, 'पासकी से साइन अप करें' बटन पर क्लिक करके पासकी बनाएं.

4. क्रेडेंशियल देने वाले प्रोग्राम में पासवर्ड सेव करें

इस ऐप्लिकेशन में, आपकी साइन अप स्क्रीन में, जानकारी देने के लिए पहले से ही उपयोगकर्ता नाम और पासवर्ड लागू किया गया है.

पासवर्ड देने वाली कंपनी के साथ उपयोगकर्ता पासवर्ड क्रेडेंशियल सेव करने के लिए, आपको पासवर्ड सेव करने के लिए createCredential() को पास करने के लिए CreatePasswordRequest लागू करना होगा.

  • signUpWithPassword() तरीका ढूंढें, TODO को createPassword कॉल में बदलें :

SignUpFragment.kt

//TODO : Save the user credential password with their password provider

createPassword()
  • createPassword() के अंदर, आपको इस तरह के पासवर्ड का अनुरोध बनाना होगा, TODO को नीचे दिए गए कोड से बदलें :

SignUpFragment.kt

//TODO : CreatePasswordRequest with entered username and password

val request = CreatePasswordRequest(
   binding.username.text.toString(),
   binding.password.text.toString()
)
  • इसके बाद, createPassword() विधि के अंदर, आपको पासवर्ड बनाने के अनुरोध के साथ क्रेडेंशियल बनाना होगा और उपयोगकर्ता पासवर्ड क्रेडेंशियल को उनके पासवर्ड देने वाले के पास सेव करना होगा, TODO को नीचे दिए गए कोड से बदलना होगा :

SignUpFragment.kt

//TODO : Create credential with created password request


try {
   credentialManager.createCredential(request, requireActivity()) as CreatePasswordResponse
} catch (e: Exception) {
   Log.e("Auth", " Exception Message : " + e.message)
}
  • अब आपने बस एक टैप में पासवर्ड के ज़रिए प्रमाणित करने के लिए उपयोगकर्ता के पासवर्ड कंपनी के पास पासवर्ड क्रेडेंशियल को सफलतापूर्वक सेव कर लिया है.

5. पासकी या पासवर्ड से पुष्टि करने की सुविधा जोड़ें

अब आप इसका इस्तेमाल, अपने ऐप्लिकेशन में सुरक्षित तरीके से अपनी पहचान की पुष्टि करने के लिए कर सकते हैं.

629001f4a778d4fb.png

getPasskey() कॉल को पास करने के लिए, चैलेंज और अन्य विकल्पों को हासिल करें

उपयोगकर्ता को पुष्टि करने के लिए कहने से पहले, आपको सर्वर से WebAuthn json में एक चैलेंज शामिल करने के लिए पैरामीटर का अनुरोध करना होगा.

आपके पास पहले से ही अपनी ऐसेट(AuthFromServer.txt) में मॉक रिस्पॉन्स मौजूद है, जो इस कोडलैब में ऐसे पैरामीटर दिखाता है.

  • अपने ऐप्लिकेशन में, SignInफ़्रैगमेंट.kt पर जाएं और ऐसा signInWithSavedCredentials तरीका ढूंढें जिसमें सेव की गई पासकी या पासवर्ड की मदद से पुष्टि करने के लिए लॉजिक लिखा जाएगा. इसके बाद, लोगों को यहां जाने की अनुमति दी जाएगी :
  • createPasskey() को कॉल करने के लिए टिप्पणी वाले अन्य ब्लॉक को चेक करें और निम्न कोड से बदलें :

SignInFragment.kt

//TODO : Call getSavedCredentials() method to signin using passkey/password

val data = getSavedCredentials()
  • getSavedक्रेडेंशियल() तरीके के अंदर, आपको क्रेडेंशियल देने वाले से क्रेडेंशियल पाने के लिए ज़रूरी पैरामीटर के साथ एक GetPublicKeyCredentialOption() बनाना होगा.

SigninFragment.kt

//TODO create a GetPublicKeyCredentialOption() with necessary registration json from server

val getPublicKeyCredentialOption =
   GetPublicKeyCredentialOption(fetchAuthJsonFromServer(), null)

यह BringAuthJsonFromServer() तरीका है. यह ऐसेट से, पुष्टि करने वाले json रिस्पॉन्स को पढ़ता है और इस उपयोगकर्ता खाते से जुड़ी सभी पासकी वापस पाने के लिए, पुष्टि करने वाला json दिखाता है.

दूसरा पैरामीटर : clientDataHash - यह हैश, भरोसेमंद पक्ष की पहचान की पुष्टि करने के लिए इस्तेमाल किया जाता है. यह सिर्फ़ तब सेट किया जाता है, जब आपने GetCredentialRequest.origin को सेट किया हो. सैंपल ऐप्लिकेशन के लिए, यह वैल्यू शून्य है.

तीसरा पैरामीटर तब सही होता है, जब रिमोट क्रेडेंशियल न मिलने पर कोई कार्रवाई तुरंत रिटर्न करे, न कि रिमोट क्रेडेंशियल. वहीं, गलत (डिफ़ॉल्ट) पर सेट हो जाता है.

  • BringAuthJsonFromServer() तरीका खोजें और json पाने के लिए, TODO को नीचे दिए गए कोड से बदलें. साथ ही, खाली स्ट्रिंग लौटाए गए स्टेटमेंट को भी हटाएं :

SignInFragment.kt

//TODO fetch authentication mock json

return requireContext().readFromAsset("AuthFromServer")

ध्यान दें : इस कोडलैब के सर्वर को ऐसा JSON दिखाने के लिए डिज़ाइन किया गया है जो एपीआई के getCredential() कॉल को पास किए जाने वाले PublicKeyCredentialRequestOptions डिक्शनरी की तरह ही होता है. नीचे दिए गए कोड स्निपेट में, उदाहरण के तौर पर कुछ विकल्प दिए गए हैं. ये विकल्प आपको मिलने चाहिए:

{
  "challenge": String,
  "rpId": String,
  "userVerification": "",
  "timeout": 1800000
}

यह टेबल पूरी नहीं है, लेकिन इसमें PublicKeyCredentialRequestOptions डिक्शनरी में मौजूद ज़रूरी पैरामीटर शामिल हैं:

पैरामीटर

जानकारी

challenge

ArrayBuffer ऑब्जेक्ट में, सर्वर से जनरेट किया गया चैलेंज. रीप्ले से होने वाले हमलों से बचने के लिए, ऐसा करना ज़रूरी है. एक जवाब को दो बार स्वीकार न करें. इसे सीएसआरएफ टोकन समझें.

rpId

आरपी आईडी एक डोमेन होता है. कोई वेबसाइट अपने डोमेन या रजिस्ट्रेशन किया जा सकने वाला सफ़िक्स तय कर सकती है. यह वैल्यू, पासकी बनाते समय इस्तेमाल किए गए rp.id पैरामीटर से मेल खानी चाहिए.

  • इसके बाद, आपको इस उपयोगकर्ता खाते के लिए Credential Manager API के ज़रिए, पासवर्ड देने वाली कंपनी में सेव किए गए सभी पासवर्ड वापस पाने के लिए, एक PasswordOption() ऑब्जेक्ट बनाना होगा. getSavedक्रेडेंशियल() विधि के अंदर, TODO को ढूंढें और उसे निम्न से बदलें :

SigninFragment.kt

//TODO create a PasswordOption to retrieve all the associated user's password

val getPasswordOption = GetPasswordOption()

क्रेडेंशियल पाएं

  • इसके बाद, संबंधित क्रेडेंशियल फिर से पाने के लिए, आपको ऊपर दिए गए सभी विकल्पों के साथ getCredential() अनुरोध को कॉल करना होगा :

SignInFragment.kt

//TODO call getCredential() with required credential options

val result = try {
   credentialManager.getCredential(
       requireActivity(),
       GetCredentialRequest(
           listOf(
               getPublicKeyCredentialOption,
               getPasswordOption
           )  
     )
   )
} catch (e: Exception) {
   configureViews(View.INVISIBLE, true)
   Log.e("Auth", "getCredential failed with exception: " + e.message.toString())
   activity?.showErrorAlert(
       "An error occurred while authenticating through saved credentials. Check logs for additional details"
   )
   return null
}

if (result.credential is PublicKeyCredential) {
   val cred = result.credential as PublicKeyCredential
   DataProvider.setSignedInThroughPasskeys(true)
   return "Passkey: ${cred.authenticationResponseJson}"
}
if (result.credential is PasswordCredential) {
   val cred = result.credential as PasswordCredential
   DataProvider.setSignedInThroughPasskeys(false)
   return "Got Password - User:${cred.id} Password: ${cred.password}"
}
if (result.credential is CustomCredential) {
   //If you are also using any external sign-in libraries, parse them here with the utility functions provided.
}

  • getक्रेडेंशियल() के लिए ज़रूरी जानकारी पास करनी होती है. इसके लिए, क्रेडेंशियल के विकल्पों की सूची और गतिविधि के कॉन्टेक्स्ट की मदद ली जाती है. इससे उस कॉन्टेक्स्ट के लिए बॉटमशीट में मौजूद विकल्पों को रेंडर किया जा सकता है.
  • अनुरोध स्वीकार होने के बाद, आपको स्क्रीन पर एक बॉटमशीट दिखेगी. इसमें, इससे जुड़े खाते के लिए बनाए गए सभी क्रेडेंशियल की जानकारी होगी.
  • चुने गए क्रेडेंशियल की पुष्टि करने के लिए, अब उपयोगकर्ता बायोमेट्रिक्स या स्क्रीन लॉक वगैरह से अपनी पहचान की पुष्टि कर सकते हैं.
  • आपने SignedInथ्रूPasskeys फ़्लैग को 'सही है' के तौर पर सेट किया है. इससे पता चलता है कि आपने पासकी से लॉग इन किया है. नहीं तो गलत.
  • रेंडर किए गए व्यू के दिखने की सेटिंग मैनेज की जा सकती है. साथ ही, किसी वजह से अनुरोध पूरा नहीं होने या न होने पर, अपवादों को हैंडल किया जा सकता है. यहां गड़बड़ी के मैसेज लॉग किए जाते हैं और गड़बड़ी के डायलॉग में ऐप्लिकेशन में दिखाए जाते हैं. Android Studio या adb डीबग निर्देश की मदद से, गड़बड़ी के पूरे लॉग देखे जा सकते हैं
  • अब आपको रजिस्ट्रेशन की प्रक्रिया पूरी करनी होगी. इसके लिए, आपको सर्वर पर सार्वजनिक पासकोड का क्रेडेंशियल भेजना होगा और उपयोगकर्ता को साइन इन करने की अनुमति देनी होगी. ऐप्लिकेशन को क्रेडेंशियल ऑब्जेक्ट मिलता है, जिसमें एक सार्वजनिक कुंजी होती है. इसे सर्वर पर भेजकर, पासकी के ज़रिए पुष्टि की जा सकती है.

यहां हमने एक मॉक सर्वर का इस्तेमाल किया है, इसलिए हम 'सही' दिखाते हैं. इससे यह पता चलता है कि सर्वर ने सार्वजनिक पासकोड की पुष्टि की है.

signInWithSavedCredentials() तरीके के अंदर, काम की टिप्पणी ढूंढें और उसे नीचे दिए गए कोड से बदलें:

SignInFragment.kt

//TODO : complete the authentication process after validating the public key credential to your server and let the user in.

data?.let {
   sendSignInResponseToServer()
   listener.showHome()
}
  • sendSigninResponseToServer() 'सही' दिखाता है, जिससे यह पता चलता है कि सर्वर ने आने वाले समय में इस्तेमाल के लिए, सार्वजनिक पासकोड की पुष्टि कर दी है.
  • लॉग इन करने के बाद, उपयोगकर्ता को होम स्क्रीन पर रीडायरेक्ट किया जाता है.

यहां दिए गए कोड स्निपेट में, PublicKeyCredential ऑब्जेक्ट का उदाहरण शामिल है:

{
  "id": String
  "rawId": String
  "type": "public-key",
  "response": {
    "clientDataJSON": String
    "authenticatorData": String
    "signature": String
    "userHandle": String
  }
}

यह टेबल पूरी नहीं है, लेकिन इसमें PublicKeyCredential ऑब्जेक्ट के ज़रूरी पैरामीटर शामिल हैं:

पैरामीटर

जानकारी

id

पुष्टि किए गए पासकी क्रेडेंशियल का Base64URL कोड में बदला गया आईडी.

rawId

क्रेडेंशियल आईडी का ArrayBuffer ऑब्जेक्ट वर्शन.

response.clientDataJSON

क्लाइंट डेटा का ArrayBuffer ऑब्जेक्ट. इस फ़ील्ड में चैलेंज की जानकारी और वह ऑरिजिन शामिल होता है जिसकी पुष्टि, आरपी सर्वर को करनी है.

response.authenticatorData

पुष्टि करने वाले के डेटा का ArrayBuffer ऑब्जेक्ट. इस फ़ील्ड में आरपी आईडी जैसी जानकारी मौजूद होती है.

response.signature

हस्ताक्षर का ArrayBuffer ऑब्जेक्ट. क्रेडेंशियल में यह वैल्यू सबसे अहम होती है. इसकी पुष्टि सर्वर पर होनी चाहिए.

response.userHandle

ArrayBuffer ऑब्जेक्ट, जिसमें यूज़र आईडी सेट किया जाता है. यह आईडी बनाते समय सेट किया जाता है. अगर सर्वर को इस्तेमाल की जाने वाली आईडी वैल्यू चुननी है या बैकएंड चाहता है कि क्रेडेंशियल आईडी के लिए इंडेक्स न बनाए जाए, तो क्रेडेंशियल आईडी के बजाय इस वैल्यू का इस्तेमाल किया जा सकता है.

ऐप्लिकेशन चलाएं, साइन इन करने के लिए नेविगेट करें -> पासकी या सेव किए गए पासवर्ड से साइन इन करें और सेव किए गए क्रेडेंशियल का इस्तेमाल करके साइन इन करने की कोशिश करें.

इसे आज़माएं

आपने अपने Android ऐप्लिकेशन पर, क्रेडेंशियल मैनेजर में पासवर्ड सेव करने और पासकी या सेव किए गए पासवर्ड की मदद से पुष्टि करने की सुविधा लागू की है.

6. बधाई हो!

आपने यह कोडलैब पूरा कर लिया है! अगर आपको आखिरी समाधान देखना है, तो https://github.com/android/identity-samples/tree/main/CredentialManager पर जाएं

अगर आपका कोई सवाल है, तो उसे passkey टैग की मदद से StackOverflow पर पूछें.

ज़्यादा जानें