Bảo vệ các tài nguyên không phải Firebase bằng tính năng Kiểm tra ứng dụng trên Android

Bạn có thể bảo vệ các tài nguyên không phải Firebase của ứng dụng, chẳng hạn như các phần phụ trợ tự lưu trữ, bằng tính năng Kiểm tra ứng dụng. Để làm như vậy, bạn cần phải làm cả hai việc sau:

  • Sửa đổi ứng dụng khách của ứng dụng để gửi mã thông báo Kiểm tra ứng dụng cùng với mỗi yêu cầu đến phần phụ trợ của bạn, như mô tả trên trang này.
  • Sửa đổi phần phụ trợ của bạn để bắt buộc phải có một mã thông báo Kiểm tra ứng dụng hợp lệ cho mọi yêu cầu, như mô tả trong bài viết Xác minh mã thông báo Kiểm tra ứng dụng qua một phần phụ trợ tuỳ chỉnh.

Trước khi bắt đầu

Thêm tính năng Kiểm tra ứng dụng vào ứng dụng của bạn bằng cách dùng trình cung cấp Tính toàn vẹn của Play mặc định hoặc nhà cung cấp tuỳ chỉnh.

Gửi mã thông báo Kiểm tra ứng dụng với yêu cầu phụ trợ

Để đảm bảo các yêu cầu phụ trợ của bạn bao gồm một mã thông báo Kiểm tra ứng dụng hợp lệ và chưa hết hạn, hãy gói từng yêu cầu trong một lệnh gọi đến getAppCheckToken(). Thư viện Kiểm tra ứng dụng sẽ làm mới mã thông báo nếu cần và bạn có thể truy cập vào mã thông báo trong trình nghe thành công của phương thức.

Sau khi bạn có mã thông báo hợp lệ, hãy gửi mã đó cùng với yêu cầu tới chương trình phụ trợ của bạn. Bạn có toàn quyền quyết định thông tin cụ thể về cách thực hiện việc này. Tuy nhiên, đừng gửi mã thông báo Kiểm tra ứng dụng trong URL, bao gồm cả trong tham số truy vấn, vì điều này khiến các mã này dễ bị rò rỉ và bị chặn ngẫu nhiên. Bạn nên gửi mã thông báo trong tiêu đề HTTP tuỳ chỉnh.

Ví dụ: nếu bạn sử dụng Retrofit:

Kotlin+KTX

class ApiWithAppCheckExample {
    interface YourExampleBackendService {
        @GET("yourExampleEndpoint")
        fun exampleData(
            @Header("X-Firebase-AppCheck") appCheckToken: String,
        ): Call<List<String>>
    }

    var yourExampleBackendService: YourExampleBackendService = Retrofit.Builder()
        .baseUrl("https://yourbackend.example.com/")
        .build()
        .create(YourExampleBackendService::class.java)

    fun callApiExample() {
        Firebase.appCheck.getAppCheckToken(false).addOnSuccessListener { appCheckToken ->
            val token = appCheckToken.token
            val apiCall = yourExampleBackendService.exampleData(token)
            // ...
        }
    }
}

Java

public class ApiWithAppCheckExample {
    private interface YourExampleBackendService {
        @GET("yourExampleEndpoint")
        Call<List<String>> exampleData(
                @Header("X-Firebase-AppCheck") String appCheckToken);
    }

    YourExampleBackendService yourExampleBackendService = new Retrofit.Builder()
            .baseUrl("https://yourbackend.example.com/")
            .build()
            .create(YourExampleBackendService.class);

    public void callApiExample() {
        FirebaseAppCheck.getInstance()
                .getAppCheckToken(false)
                .addOnSuccessListener(new OnSuccessListener<AppCheckToken>() {
                    @Override
                    public void onSuccess(@NonNull AppCheckToken appCheckToken) {
                        String token = appCheckToken.getToken();
                        Call<List<String>> apiCall =
                                yourExampleBackendService.exampleData(token);
                        // ...
                    }
                });
    }
}

Chống phát lại (thử nghiệm)

Khi gửi yêu cầu đến một điểm cuối mà bạn đã bật tính năng bảo vệ hoạt động phát lại, hãy gói yêu cầu này trong một lệnh gọi đến getLimitedUseAppCheckToken() thay vì getAppCheckToken():

Kotlin+KTX

Firebase.appCheck.limitedUseAppCheckToken.addOnSuccessListener {
    // ...
}

Java

FirebaseAppCheck.getInstance()
        .getLimitedUseAppCheckToken().addOnSuccessListener(
                new OnSuccessListener<AppCheckToken>() {
                    @Override
                    public void onSuccess(AppCheckToken appCheckToken) {
                        String token = appCheckToken.getToken();
                        // ...
                    }
                }
        );