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

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

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

ก่อนที่คุณจะเริ่ม

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

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

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

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

ตัวอย่างเช่น หากคุณใช้ชุดติดตั้งเพิ่มเติม:

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();
                        // ...
                    }
                }
        );