Android के लिए ऐप्लिकेशन फ़्लिप

OAuth-आधारित ऐप फ्लिप लिंकिंग (ऐप फ्लिप) आपके एंड्रॉइड ऐप को Google खाता लिंकिंग प्रवाह में सम्मिलित करता है। एक पारंपरिक खाता लिंकिंग प्रवाह के लिए उपयोगकर्ता को ब्राउज़र में अपने क्रेडेंशियल दर्ज करने की आवश्यकता होती है। ऐप फ्लिप का उपयोग आपके एंड्रॉइड ऐप में उपयोगकर्ता साइन-इन को रोकता है, जो आपको मौजूदा प्राधिकरणों का लाभ उठाने की अनुमति देता है। यदि उपयोगकर्ता ने आपके ऐप में साइन इन किया है, तो उन्हें अपने खाते को लिंक करने के लिए अपने क्रेडेंशियल्स को फिर से दर्ज करने की आवश्यकता नहीं है। आपके एंड्रॉइड ऐप पर ऐप फ्लिप को लागू करने के लिए न्यूनतम मात्रा में कोड परिवर्तन की आवश्यकता है।

इस दस्तावेज़ में, आप सीखते हैं कि ऐप फ्लिप का समर्थन करने के लिए अपने एंड्रॉइड ऐप को कैसे संशोधित किया जाए।

नमूना का प्रयास करें

अनुप्रयोग फ्लिप जोड़ने नमूना एप्लिकेशन के लिए App फ्लिप-संगत Android पर एकीकरण जोड़ने खाते को दर्शाता है। आप इस ऐप का उपयोग यह सत्यापित करने के लिए कर सकते हैं कि Google मोबाइल ऐप से आने वाले ऐप फ्लिप इंटेंट का जवाब कैसे दिया जाए।

नमूना अनुप्रयोग के साथ एकीकृत करने के लिए पहले से कॉन्फ़िगर है Android के लिए ऐप फ्लिप टेस्ट उपकरण है, जो आप इससे पहले कि आप कॉन्फ़िगर गूगल के साथ जोड़ने खाता अनुप्रयोग फ्लिप के साथ अपने Android ऐप्लिकेशन का एकीकरण सत्यापित करने के लिए उपयोग कर सकते हैं। ऐप फ्लिप सक्षम होने पर यह ऐप Google मोबाइल ऐप द्वारा ट्रिगर किए गए इरादे का अनुकरण करता है।

यह काम किस प्रकार करता है

ऐप फ्लिप एकीकरण करने के लिए निम्नलिखित चरणों की आवश्यकता है:

  1. Google ऐप चेकों आपके ऐप को उसकी पैकेज नाम का उपयोग कर डिवाइस पर स्थापित किया गया है, तो।
  2. Google ऐप यह सत्यापित करने के लिए पैकेज हस्ताक्षर जांच का उपयोग करता है कि इंस्टॉल किया गया ऐप सही ऐप है।
  3. Google ऐप आपके ऐप में एक निर्दिष्ट गतिविधि शुरू करने का इरादा बनाता है। इस आशय में जोड़ने के लिए आवश्यक अतिरिक्त डेटा शामिल है। यह यह देखने के लिए भी जांच करता है कि आपका ऐप एंड्रॉइड फ्रेमवर्क के माध्यम से इस आशय को हल करके ऐप फ्लिप का समर्थन करता है या नहीं।
  4. आपका ऐप पुष्टि करता है कि अनुरोध Google ऐप से आ रहा है। ऐसा करने के लिए, आपका ऐप पैकेज हस्ताक्षर और प्रदान की गई क्लाइंट आईडी की जांच करता है।
  5. आपका ऐप आपके OAuth 2.0 सर्वर से एक प्राधिकरण कोड का अनुरोध करता है। इस प्रवाह के अंत में, यह Google ऐप को या तो एक प्राधिकरण कोड या एक त्रुटि देता है।
  6. Google ऐप परिणाम पुनर्प्राप्त करता है और खाता लिंकिंग के साथ जारी रहता है। यदि एक प्राधिकरण कोड प्रदान किया जाता है, तो टोकन एक्सचेंज सर्वर-टू-सर्वर होता है, ठीक उसी तरह जैसे ब्राउज़र-आधारित OAuth लिंकिंग प्रवाह में होता है।

ऐप फ्लिप का समर्थन करने के लिए अपने एंड्रॉइड ऐप को संशोधित करें

ऐप फ्लिप का समर्थन करने के लिए, अपने एंड्रॉइड ऐप में निम्नलिखित कोड परिवर्तन करें:

  1. एक जोड़े <intent-filter> अपने को AndroidManifest.xml फ़ाइल एक कार्रवाई स्ट्रिंग है कि आप अनुप्रयोग फ्लिप आशय फ़ील्ड में दर्ज किया मान से मेल खाता है।

    <activity android:name="AuthActivity">
      <!-- Handle the app flip intent -->
      <intent-filter>
        <action android:name="INTENT_ACTION_FROM_CONSOLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
    </activity>
    
  2. कॉलिंग ऐप के सिग्नेचर को वैलिडेट करें।

    private fun verifyFingerprint(
            expectedPackage: String,
            expectedFingerprint: String,
            algorithm: String
    ): Boolean {
    
        callingActivity?.packageName?.let {
            if (expectedPackage == it) {
                val packageInfo =
                    packageManager.getPackageInfo(it, PackageManager.GET_SIGNATURES)
                val signatures = packageInfo.signatures
                val input = ByteArrayInputStream(signatures[0].toByteArray())
    
                val certificateFactory = CertificateFactory.getInstance("X509")
                val certificate =
                    certificateFactory.generateCertificate(input) as X509Certificate
                val md = MessageDigest.getInstance(algorithm)
                val publicKey = md.digest(certificate.encoded)
                val fingerprint = publicKey.joinToString(":") { "%02X".format(it) }
    
                return (expectedFingerprint == fingerprint)
            }
        }
        return false
    }
    
  3. इंटेंट पैरामीटर से क्लाइंट आईडी निकालें और सत्यापित करें कि क्लाइंट आईडी अपेक्षित मान से मेल खाता है।

    private const val EXPECTED_CLIENT = "<client-id-from-actions-console>"
    private const val EXPECTED_PACKAGE = "<google-app-package-name>"
    private const val EXPECTED_FINGERPRINT = "<google-app-signature>"
    private const val ALGORITHM = "SHA-256"
    ...
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        val clientId = intent.getStringExtra("CLIENT_ID")
    
        if (clientId == EXPECTED_CLIENT &&
            verifyFingerprint(EXPECTED_PACKAGE, EXPECTED_FINGERPRINT, ALGORITHM)) {
    
            // ...authorize the user...
        }
    }
    
  4. सफल प्राधिकरण पर, परिणामी प्राधिकरण कोड वापस Google को लौटा दें।

    // Successful result
    val data = Intent().apply {
        putExtra("AUTHORIZATION_CODE", authCode)
    }
    setResult(Activity.RESULT_OK, data)
    finish()
    
  5. अगर कोई त्रुटि हुई, तो इसके बजाय एक त्रुटि परिणाम लौटाएं।

    // Error result
    val error = Intent().apply {
        putExtra("ERROR_TYPE", 1)
        putExtra("ERROR_CODE", 1)
        putExtra("ERROR_DESCRIPTION", "Invalid Request")
    }
    setResult(-2, error)
    finish()
    

लॉन्च इरादे की सामग्री

आपके ऐप को लॉन्च करने वाले Android इंटेंट में निम्नलिखित फ़ील्ड शामिल हैं:

  • CLIENT_ID ( String ): गूगल client_id अपने अनुप्रयोग के तहत पंजीकृत।
  • SCOPE ( String[] ): अनुरोध स्कोप की एक सूची।
  • REDIRECT_URI ( String ): रीडायरेक्ट URL।

प्रतिक्रिया डेटा की सामग्री

डेटा Google ऐप को लौट अपने ऐप्लिकेशन में कॉलिंग द्वारा निर्धारित है setResult() इस डेटा में निम्नलिखित शामिल हैं:

  • AUTHORIZATION_CODE ( String ): प्राधिकरण कोड मूल्य।
  • resultCode ( int ): संचार सफलता या प्रक्रिया की विफलता और निम्न में से एक मान लेता है:
    • Activity.RESULT_OK : सफलता को इंगित करता है; एक प्राधिकरण कोड लौटाया जाता है।
    • Activity.RESULT_CANCELLED : उपयोगकर्ता प्रक्रिया को रद्द कर दिया सिग्नल कि। इस मामले में, Google ऐप आपके प्राधिकरण URL का उपयोग करके खाता लिंक करने का प्रयास करेगा।
    • -2 : यह दर्शाता है कि एक त्रुटि हुई है। विभिन्न प्रकार की त्रुटियों का वर्णन नीचे किया गया है।
  • ERROR_TYPE ( int ): त्रुटि का प्रकार है, जो निम्नलिखित में से एक मान लेता है:
    • 1 : वसूली त्रुटि: Google ऐप खाता प्राधिकरण यूआरएल का उपयोग कर जोड़ने का प्रयास करेंगे।
    • 2 : अप्राप्य त्रुटि: THE Google ऐप रोकता जोड़ने खाते।
    • 3 : अमान्य या अनुपस्थित अनुरोध पैरामीटर।
  • ERROR_CODE ( int ): एक पूर्णांक त्रुटि की प्रकृति को दर्शाता है। क्या प्रत्येक त्रुटि कोड साधन, का उल्लेख देखने के लिए त्रुटि कोड की तालिका
  • ERROR_DESCRIPTION ( String , वैकल्पिक): मानव पठनीय स्थिति संदेश त्रुटि का वर्णन।

के लिए एक मूल्य AUTHORIZATION_CODE जब उम्मीद है resultCode == Activity.RESULT_OK । अन्य सभी मामलों में, के लिए मूल्य AUTHORIZATION_CODE खाली होने की जरूरत है। यदि resultCode == -2 , तो ERROR_TYPE मूल्य आबादी होने की उम्मीद है।

त्रुटि कोड की तालिका

नीचे दी गई तालिका अलग-अलग त्रुटि कोड दिखाती है और क्या प्रत्येक एक पुनर्प्राप्ति योग्य या अपरिवर्तनीय त्रुटि है:

त्रुटि कोड अर्थ बचानेवाला अप्राप्य
1 INVALID_REQUEST
2 NO_INTERNET_CONNECTION
3 OFFLINE_MODE_ACTIVE
4 CONNECTION_TIMEOUT
5 INTERNAL_ERROR
6 AUTHENTICATION_SERVICE_UNAVAILABLE
8 CLIENT_VERIFICATION_FAILED
9 INVALID_CLIENT
10 INVALID_APP_ID
11 INVALID_REQUEST
12 AUTHENTICATION_SERVICE_UNKNOWN_ERROR
13 AUTHENTICATION_DENIED_BY_USER
14 CANCELLED_BY_USER
15 FAILURE_OTHER
16 USER_AUTHENTICATION_FAILED

सभी त्रुटि कोड के लिए, आप के माध्यम से त्रुटि परिणाम लौटना चाहिए setResult सुनिश्चित करने के लिए उचित fallback trigerred है।