ปกป้องทรัพยากรที่ไม่ใช่ Firebase ด้วย App Check ใน Android

คุณปกป้องทรัพยากรของแอปที่ไม่ใช่ Firebase เช่น แบ็กเอนด์ที่โฮสต์ด้วยตนเองได้ด้วย App Check โดยคุณจะต้องทำทั้ง 2 อย่างต่อไปนี้

  • แก้ไขไคลเอ็นต์แอปเพื่อส่งโทเค็น App Check พร้อมกับคำขอแต่ละรายการไปยังแบ็กเอนด์ตามที่อธิบายไว้ในหน้านี้
  • แก้ไขแบ็กเอนด์เพื่อให้ต้องมีโทเค็น App Check ที่ถูกต้องในทุกๆ คำขอ ดังที่อธิบายไว้ในหัวข้อยืนยันโทเค็น App Check จากแบ็กเอนด์ที่กำหนดเอง

ก่อนเริ่มต้น

เพิ่ม App Check ลงในแอปโดยใช้ผู้ให้บริการ Play Integrity เริ่มต้นหรือผู้ให้บริการที่กำหนดเอง

ส่งโทเค็น App Check ที่มีคำขอแบ็กเอนด์

รวมคำขอแต่ละรายการไว้ในการเรียก getAppCheckToken() เพื่อให้แน่ใจว่าคำขอแบ็กเอนด์มีโทเค็น App Check ที่ถูกต้องและยังไม่หมดอายุ ไลบรารี App Check จะรีเฟรชโทเค็นหากจำเป็น และคุณจะเข้าถึงโทเค็นดังกล่าวได้ใน Listener ความสำเร็จของเมธอด

เมื่อคุณมีโทเค็นที่ถูกต้องแล้ว ให้ส่งโทเค็นนั้นพร้อมกับคำขอไปยังแบ็กเอนด์ คุณจะเป็นผู้กำหนดวิธีการบรรลุผลดังกล่าวด้วยตนเองก็ได้ แต่อย่าส่งโทเค็น App Check เป็นส่วนหนึ่งของ URL ซึ่งรวมถึงในพารามิเตอร์การค้นหา เนื่องจากอาจทำให้เสี่ยงต่อการรั่วไหลและถูกสกัดกั้นโดยไม่ได้ตั้งใจ วิธีการที่แนะนำคือการส่งโทเค็นในส่วนหัว HTTP ที่กำหนดเอง

เช่น หากคุณใช้ 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);
                        // ...
                    }
                });
    }
}

การป้องกันการเล่นซ้ำ (เบต้า)

เมื่อส่งคำขอไปยังปลายทางที่คุณได้เปิดใช้การป้องกันการเล่นซ้ำ ให้ส่งคำขอไปยัง getLimitedUseAppCheckToken() แทน 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();
                        // ...
                    }
                }
        );