Schützen Sie Nicht-Firebase-Ressourcen mit App Check auf iOS

Sie können die Nicht-Firebase-Ressourcen Ihrer App, z. B. selbstgehostete Back-Ends, mit App Check schützen. Dazu müssen Sie Ihren App-Client so ändern, dass er mit jeder Anfrage ein App-Check-Token an Ihr Back-End sendet, und Ihr Back-End so ändern, dass bei jeder Anfrage ein gültiges App-Check-Token erforderlich ist. beide Aufgaben werden im Folgenden beschrieben.

Bevor Sie beginnen

In App Überprüfen Sie Ihre App, entweder App Attest , DeviceCheck oder einen benutzerdefinierten Anbieter .

Senden Sie App-Check-Token mit Back-End-Anfragen

Um sicherzustellen , dass Ihre Backend - Anforderungen umfassen ein gültiger, noch nicht abgelaufen, App überprüfen Token, wickelt jede Anforderung in einem Aufruf an AppCheck.token() . Die App Check-Bibliothek aktualisiert das Token bei Bedarf, und Sie können auf das Token im Abschlussblock der Methode zugreifen.

Sobald Sie ein gültiges Token haben, senden Sie es zusammen mit der Anfrage an Ihr Backend. Die Besonderheiten, wie Sie dies zu erreichen sind bis zu Ihnen, aber nicht App überprüfen Token als Teil von URLs, einschließlich in Abfrageparametern senden, da dies sie anfällig für versehentliche Leckage und Abfangen macht. Im folgenden Beispiel wird das Token in einem benutzerdefinierten HTTP-Header gesendet, was der empfohlene Ansatz ist.

Schnell

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()
}

Ziel 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];
}];

Überprüfen Sie die App-Check-Token im Back-End

In Ihrem Backend - Code, wenn Sie nicht bereits installiert haben Node.js Admin SDK , dazu. Fügen Sie dann Ihren API-Endpunkten Logik hinzu, die Folgendes bewirkt:

  • Stellen Sie sicher, dass jede Anfrage ein App Check-Token enthält.

  • Überprüfen Sie die App überprüfen Token des Admin SDK mit appCheck().verifyToken() Methode.

    Wenn die Überprüfung erfolgreich, verifyToken() gibt die decodierte App Token prüfen. Eine erfolgreiche Überprüfung zeigt an, dass das Token von einer App stammt, die zu Ihrem Firebase-Projekt gehört.

Lehnen Sie alle Anfragen ab, die eine der beiden Prüfungen nicht bestehen. Verwenden Sie beispielsweise die Express.js-Middleware:

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