היפוך האפליקציה ל-Android

קישור App Flip מבוסס OAuth (App Flip) מכניס את אפליקציית Android שלך לזרימת קישור חשבון Google. זרימת קישור חשבונות מסורתית מחייבת את המשתמש להזין את האישורים שלו בדפדפן. השימוש ב-App Flip דוחה את הכניסה של המשתמש לאפליקציית Android שלך, מה שמאפשר לך למנף הרשאות קיימות. אם המשתמש מחובר לאפליקציה שלך, הוא לא צריך להזין מחדש את האישורים שלו כדי לקשר את החשבון שלו. נדרשת כמות מינימלית של שינויי קוד כדי ליישם את App Flip באפליקציית Android שלך.

במסמך זה, תלמד כיצד לשנות את אפליקציית Android שלך כך שתתמוך ב-App Flip.

נסה את הדוגמה

תהפכו App המקשר אפליקציה לדוגמה מדגים חשבון App Flip-תואם לקישור אינטגרציה על אנדרואיד. אתה יכול להשתמש באפליקציה זו כדי לאמת כיצד להגיב לכוונה נכנסת ל-App Flip מאפליקציות Google לנייד.

אפליקציית מדגם מוגדר מראש לשלב עם כלי App Flip מבחן עבור אנדרואיד , שבו אתה יכול להשתמש בו כדי לוודא אינטגרציה של אפליקציות אנדרואיד שלך עם Flip App לפני שתגדיר חשבון מקשרים עם גוגל. אפליקציה זו מדמה את הכוונה המופעלת על ידי אפליקציות Google לנייד כאשר App Flip מופעלת.

איך זה עובד

השלבים הבאים נדרשים לביצוע שילוב App Flip:

  1. בודקת את האפליקציה Google אם האפליקציה שלך מותקנת על המכשיר באמצעות שם החבילה שלה.
  2. אפליקציית Google משתמשת בבדיקת חתימת חבילה כדי לאמת שהאפליקציה המותקנת היא האפליקציה הנכונה.
  3. אפליקציית Google בונה כוונה להתחיל פעילות ייעודית באפליקציה שלך. כוונה זו כוללת נתונים נוספים הנדרשים לקישור. זה גם בודק אם האפליקציה שלך תומכת ב-App Flip על ידי פתרון כוונה זו באמצעות מסגרת Android.
  4. האפליקציה שלך מאמתת שהבקשה מגיעה מאפליקציית Google. לשם כך, האפליקציה שלך בודקת את חתימת החבילה ואת מזהה הלקוח שסופק.
  5. האפליקציה שלך מבקשת קוד הרשאה משרת OAuth 2.0 שלך. בסוף זרימה זו, הוא מחזיר לאפליקציית Google קוד הרשאה או שגיאה.
  6. אפליקציית Google מאחזרת את התוצאה וממשיכה בקישור החשבון. אם מסופק קוד הרשאה, חילופי האסימונים מתרחשים בין שרת לשרת, באותה צורה שהיא מתבצעת בזרימת הקישור של OAuth מבוסס-דפדפן.

שנה את אפליקציית האנדרואיד שלך כך שתתמוך ב-App Flip

כדי לתמוך ב-App Flip, בצע את שינויי הקוד הבאים באפליקציית Android שלך:

  1. הוספה <intent-filter> כדי שלך AndroidManifest.xml קובץ עם מחרוזת פעולה שמתאימה לערך שהזנת בתחום כוונות Flip App.

    <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 ): Google client_id רשום תחת האפליקציה שלך.
  • SCOPE ( String[] ): רשימת טווחי המבוקש.
  • REDIRECT_URI ( String ): כתובת האתר של ההפניה.

תוכן נתוני התגובה

הנתונים חזרה ליישום Google מוגדר באפליקציה על ידי התקשרות setResult() . נתונים אלה כוללים את הדברים הבאים:

  • AUTHORIZATION_CODE ( String ): ערך קוד אישור.
  • resultCode ( int ): מתקשר להצלחה או כישלון של התהליך לוקח את אחד הערכים הבאים:
    • Activity.RESULT_OK : מציין הצלחה; מוחזר קוד הרשאה.
    • Activity.RESULT_CANCELLED : אותות שהמשתמש ביטל את התהליך. במקרה זה, אפליקציית Google תנסה לקשר חשבון באמצעות כתובת האתר של ההרשאה שלך.
    • -2 : מציין כי אירעה תקלה. סוגים שונים של שגיאות מתוארים להלן.
  • ERROR_TYPE ( int ): סוג השגיאה, אשר לוקח את אחד הערכים הבאים:
    • 1 : שגיאת השבה: אפליקציית Google תנסה חשבון המקשר באמצעות URL האישור.
    • 2 : שגיאה בלתי הפיכה: ביטולי אפליקציה של גוגל קישור חשבונות.
    • 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.