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

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

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

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

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

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

หากต้องการตรวจสอบว่าคำขอแบ็กเอนด์มีโทเค็น App Check ที่ถูกต้องและยังไม่หมดอายุ รวมคำขอแต่ละรายการเป็นการเรียกไปที่ getAppCheckToken() ไลบรารี 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();
                        // ...
                    }
                }
        );