הגן על משאבים שאינם Firebase באמצעות App Check ב- Android

אתה יכול להגן על משאבי האפליקציה שלך שאינם Firebase, כגון backends המתארחים בעצמך, באמצעות App Check. לשם כך, יהיה עליך לשנות את לקוח האפליקציות שלך כדי לשלוח אסימון צ'ק -אפליקציה יחד עם כל בקשה למערך האחורי שלך, ולשנות את הקצה שלך כדי לדרוש אסימון חוקי של צ'ק -אפליקציה עם כל בקשה; שתי המשימות מתוארות להלן.

לפני שאתה מתחיל

להוסיף App Check באפליקציה, תוך שימוש בפורמט ברירת המחדל ספק SafetyNet , או ספק מנהג .

שלח אסימונים לבדיקת אפליקציות עם בקשות backend

כדי להבטיח בקשות backend שלך כוללים תקף, שטרם חלפו, App בדוק האסימון, עוטפים כל בקשה קריאה getAppCheckToken() . ספריית App Check תרענן את האסימון במידת הצורך, ותוכל לגשת לאסימון במאזין ההצלחות של השיטה.

ברגע שיש לך אסימון תקף, שלח אותו יחד עם הבקשה למאזין האחורי שלך. הפרטים של איך אתה להשיג זאת הם תלוי בך, אבל לא שולחים אסימוני בדיקת היישום כחלק כתובות, לרבות פרמטרים של שאילתה, מכיוון שהדבר גורם להם חשוף דליפת יירוט בשוגג. הגישה המומלצת היא לשלוח את האסימון בכותרת HTTP מותאמת אישית.

לדוגמה, אם אתה משתמש ב- Retrofit:

ג'אווה

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 tokenResponse) {
                        String appCheckToken = tokenResponse.getToken();
                        Call<List<String>> apiCall =
                                yourExampleBackendService.exampleData(appCheckToken);
                        // ...
                    }
                });
    }
}

קוטלין+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() {
        FirebaseAppCheck.getInstance()
            .getAppCheckToken(false)
            .addOnSuccessListener { tokenResponse ->
                val appCheckToken = tokenResponse.token
                val apiCall = yourExampleBackendService.exampleData(appCheckToken)
                // ...
            }
    }
}

אמת אסימונים של Check Check ב- backend

בקוד backend שלך, אם אתה לא כבר התקנת SDK של ניהול Node.js , לעשות זאת. לאחר מכן, הוסף היגיון לנקודות הקצה של ה- API שלך שעושה את הפעולות הבאות:

  • בדוק שכל בקשה כוללת אסימון צ'ק App.

  • בדוק את בדיקת יישום האסימון באמצעות SDK של מנהל appCheck().verifyToken() שיטה.

    אם אימות מצליחה, verifyToken() מחזיר את App המפוענח בדוק אסימון. אימות מוצלח מציין את האסימון שמקורו באפליקציה השייכת לפרויקט Firebase שלך.

דחה כל בקשה שנכשלת בבדיקה. לדוגמה, שימוש בתוכנת הביניים Express.js:

const express = require('express');
const app = express();

const firebaseAdmin = require('firebase-admin');
const firebaseApp = firebaseAdmin.initializeApp();

const appCheckVerification = async (req, res, next) => {
    const appCheckToken = req.header('X-Firebase-AppCheck');

    if (!appCheckToken) {
        res.status(401);
        return next('Unauthorized');
    }

    try {
        const appCheckClaims = await firebaseAdmin.appCheck().verifyToken(appCheckToken);

        // If verifyToken() succeeds, continue with the next middleware
        // function in the stack.
        return next();
    } catch (err) {
        res.status(401);
        return next('Unauthorized');
    }
}

app.get('/yourApiEndpoint', [appCheckVerification], (req, res) => {
    // Handle request.
});