Lật ứng dụng dành cho Android

Liên kết Lật ứng dụng dựa trên OAuth (Lật ứng dụng) sẽ chèn ứng dụng Android của bạn vào quy trình Liên kết tài khoản Google. Luồng liên kết tài khoản truyền thống yêu cầu người dùng nhập thông tin đăng nhập của họ vào trình duyệt. Việc sử dụng App Flip ngăn cản việc đăng nhập của người dùng vào ứng dụng Android của bạn, điều này cho phép bạn tận dụng các quyền hiện có. Nếu người dùng đã đăng nhập vào ứng dụng của bạn, họ không cần nhập lại thông tin đăng nhập để liên kết tài khoản của mình. Cần một số lượng thay đổi mã tối thiểu để triển khai Lật ứng dụng trên ứng dụng Android của bạn.

Trong tài liệu này, bạn tìm hiểu cách sửa đổi ứng dụng Android của mình để hỗ trợ App Flip.

Thử mẫu

Flip App liên kết ứng dụng mẫu chứng minh một App tài khoản Flip-tương thích liên kết tích hợp trên Android. Bạn có thể sử dụng ứng dụng này để xác minh cách phản hồi ý định Lật ứng dụng đến từ các ứng dụng dành cho thiết bị di động của Google.

Ứng dụng mẫu được cấu hình sẵn để tích hợp với các ứng dụng Lật Công cụ thử nghiệm dành cho Android , bạn có thể sử dụng để xác minh tích hợp ứng dụng Android của bạn với App lật trước khi bạn cấu hình tài khoản liên kết với Google. Ứng dụng này mô phỏng mục đích được kích hoạt bởi các ứng dụng dành cho thiết bị di động của Google khi bật App Flip.

Làm thế nào nó hoạt động

Các bước sau là bắt buộc để thực hiện tích hợp Lật ứng dụng:

  1. Kiểm tra ứng dụng Google nếu ứng dụng của bạn được cài đặt trên các thiết bị sử dụng tên gói của nó.
  2. Ứng dụng Google sử dụng kiểm tra chữ ký gói để xác thực rằng ứng dụng đã cài đặt là ứng dụng chính xác.
  3. Ứng dụng Google xây dựng ý định để bắt đầu một hoạt động được chỉ định trong ứng dụng của bạn. Mục đích này bao gồm dữ liệu bổ sung cần thiết để liên kết. Nó cũng kiểm tra xem ứng dụng của bạn có hỗ trợ App Flip hay không bằng cách giải quyết mục đích này thông qua khung Android.
  4. Ứng dụng của bạn xác thực rằng yêu cầu đến từ ứng dụng Google. Để làm như vậy, ứng dụng của bạn sẽ kiểm tra chữ ký gói và ID khách hàng được cung cấp.
  5. Ứng dụng của bạn yêu cầu mã ủy quyền từ máy chủ OAuth 2.0 của bạn. Khi kết thúc quy trình này, nó sẽ trả về mã ủy quyền hoặc lỗi cho ứng dụng Google.
  6. Ứng dụng Google truy xuất kết quả và tiếp tục với liên kết tài khoản. Nếu mã ủy quyền được cung cấp, quá trình trao đổi mã thông báo sẽ diễn ra giữa máy chủ với máy chủ, giống như cách nó thực hiện trong luồng liên kết OAuth dựa trên trình duyệt.

Sửa đổi ứng dụng Android của bạn để hỗ trợ App Flip

Để hỗ trợ App Flip, hãy thực hiện các thay đổi mã sau đối với ứng dụng Android của bạn:

  1. Thêm một <intent-filter> để bạn AndroidManifest.xml tập tin với một chuỗi hành động phù hợp với giá trị mà bạn nhập vào App lĩnh vực Ý định Flip.

    <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. Xác thực chữ ký của ứng dụng gọi điện.

    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. Trích xuất ID khách hàng từ các thông số mục đích và xác minh rằng ID khách hàng khớp với giá trị mong đợi.

    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. Sau khi ủy quyền thành công, hãy trả lại mã ủy quyền kết quả cho Google.

    // Successful result
    val data = Intent().apply {
        putExtra("AUTHORIZATION_CODE", authCode)
    }
    setResult(Activity.RESULT_OK, data)
    finish()
    
  5. Nếu xảy ra lỗi, hãy trả về kết quả lỗi.

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

Nội dung của ý định ra mắt

Mục đích Android khởi chạy ứng dụng của bạn bao gồm các trường sau:

  • CLIENT_ID ( String ): Google client_id đăng ký theo ứng dụng của bạn.
  • SCOPE ( String[] ): Một danh sách các phạm vi được yêu cầu.
  • REDIRECT_URI ( String ): URL chuyển hướng.

Nội dung của dữ liệu phản hồi

Các dữ liệu trả về cho ứng dụng Google được thiết lập trong ứng dụng của bạn bằng cách gọi setResult() . Dữ liệu này bao gồm những điều sau:

  • AUTHORIZATION_CODE ( String ): Giá trị mã ủy quyền.
  • resultCode ( int ): giao tiếp sự thành công hay thất bại của quá trình này và có một trong các giá trị sau:
    • Activity.RESULT_OK : Chỉ ra thành công; một mã ủy quyền được trả lại.
    • Activity.RESULT_CANCELLED : Tín hiệu mà người dùng đã hủy bỏ quá trình này. Trong trường hợp này, ứng dụng Google sẽ cố gắng liên kết tài khoản bằng URL ủy quyền của bạn.
    • -2 : Chỉ ra rằng một lỗi đã xảy ra. Các loại lỗi khác nhau được mô tả bên dưới.
  • ERROR_TYPE ( int ): Các loại lỗi, trong đó có một trong các giá trị sau:
    • 1 : Lỗi Recoverable: Các ứng dụng Google sẽ cố tài khoản liên kết bằng cách sử dụng URL cho phép.
    • 2 : Unrecoverable lỗi: chiếm hủy bỏ ứng dụng Google liên kết.
    • 3 : không hợp lệ hoặc thông số yêu cầu thiếu.
  • ERROR_CODE ( int ): Một số nguyên đại diện cho bản chất của lỗi. Để xem những gì mỗi mã lỗi phương tiện, hãy tham khảo bảng mã lỗi .
  • ERROR_DESCRIPTION ( String , không bắt buộc): thông báo trạng thái của con người có thể đọc được mô tả lỗi.

Một giá trị cho AUTHORIZATION_CODE được mong đợi khi resultCode == Activity.RESULT_OK . Trong mọi trường hợp khác, giá trị cho AUTHORIZATION_CODE cần phải được sản phẩm nào. Nếu resultCode == -2 thì ERROR_TYPE giá trị dự kiến sẽ được dân cư.

Bảng mã lỗi

Bảng bên dưới hiển thị các mã lỗi khác nhau và liệu mỗi mã là lỗi có thể khôi phục được hay không thể khôi phục:

Mã lỗi Nghĩa Có thể phục hồi Không thể phục hồi
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

Đối với tất cả các mã lỗi, bạn phải trả lại kết quả lỗi qua setResult để đảm bảo dự phòng thích hợp được trigerred.