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

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

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

להוסיף App Check באפליקציה, או באמצעות אפליקציה להעיד , DeviceCheck , או ספק מנהג .

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

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

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

מָהִיר

AppCheck.appCheck().token(forcingRefresh: false) { token, error in
    guard error == nil else {
        // Handle any errors if the token was not retrieved.
        print("Unable to retrieve App Check token: \(error!)")
        return
    }
    guard let token = token else {
        print("Unable to retrieve App Check token.")
        return
    }

    // Get the raw App Check token string.
    let tokenString = token.token

    // Include the App Check token with requests to your server.
    let url = URL(string: "https://yourbackend.example.com/yourApiEndpoint")!
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.setValue(tokenString, forHTTPHeaderField: "X-Firebase-AppCheck")

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        // Handle response from your backend.
    }
    task.resume()
}

Objective-C

[[FIRAppCheck appCheck] tokenForcingRefresh:NO
                                 completion:^(FIRAppCheckToken * _Nullable token,
                                              NSError * _Nullable error) {
    if (error != nil) {
        // Handle any errors if the token was not retrieved.
        NSLog(@"Unable to retrieve App Check token: %@", error);
        return;
    }
    if (token == nil) {
        NSLog(@"Unable to retrieve App Check token.");
        return;
    }

    // Get the raw App Check token string.
    NSString *tokenString = token.token;

    // Include the App Check token with requests to your server.
    NSURL *url = [[NSURL alloc] initWithString:@"https://yourbackend.example.com/yourApiEndpoint"];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    [request setHTTPMethod:@"GET"];
    [request setValue:tokenString forHTTPHeaderField:@"X-Firebase-AppCheck"];

    NSURLSessionDataTask *task =
        [[NSURLSession sharedSession] dataTaskWithRequest:request
                                        completionHandler:^(NSData * _Nullable data,
                                                            NSURLResponse * _Nullable response,
                                                            NSError * _Nullable error) {
        // Handle response from your backend.
    }];
    [task resume];
}];

אמת אסימונים של 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.
});