ปกป้องทรัพยากรแบ็กเอนด์ที่กำหนดเองด้วย App Check ใน Android

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

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

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

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

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

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

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

เช่น หากคุณใช้ Retrofit ให้ทำดังนี้

Kotlin

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

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

Java

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