Protéger les ressources autres que Firebase avec App Check sur les plates-formes Apple

Vous pouvez protéger les ressources non Firebase de votre application, telles que les backends auto-hébergés, avec App Check. Pour ce faire, vous devez effectuer les deux opérations suivantes :

  • Modifiez le client de votre application pour qu'il envoie un jeton App Check avec chaque requête à votre backend, comme décrit sur cette page.
  • Modifiez votre backend pour exiger un jeton App Check valide avec chaque requête, comme décrit dans la section Valider les jetons App Check à partir d'un backend personnalisé.

Avant de commencer

Ajoutez App Check à votre application à l'aide d'App Attest, d'DeviceCheck ou d'un fournisseur personnalisé.

Envoyer des jetons App Check avec des requêtes backend

Pour vous assurer que vos requêtes backend incluent un jeton App Check valide et non expiré, encapsulez chaque requête dans un appel à AppCheck.token(). La bibliothèque App Check actualisera le jeton si nécessaire, et vous pourrez y accéder dans le bloc de finalisation de la méthode.

Une fois que vous disposez d'un jeton valide, envoyez-le avec la requête à votre backend. La manière dont vous allez procéder est à vous, mais n'envoyez pas de jetons App Check dans les URL, y compris dans les paramètres de requête, car cela les rend vulnérables aux fuites et aux interceptions accidentelles. L'exemple suivant envoie le jeton dans un en-tête HTTP personnalisé, ce qui est l'approche recommandée.

Swift

do {
  let token = try await AppCheck.appCheck().token(forcingRefresh: false)

  // 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()
} catch(let error) {
  print("Unable to retrieve App Check token: \(error)")
  return
}

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

Protection contre le rejeu (bêta)

Lorsque vous envoyez une requête à un point de terminaison pour lequel vous avez activé la protection contre la relecture, encapsulez la requête dans un appel à limitedUseToken() au lieu de token():

Swift

AppCheck.appCheck().limitedUseToken() { token, error in
  // ...
}

Objective-C

[[FIRAppCheck appCheck] limitedUseTokenWithCompletion:^(FIRAppCheckToken * _Nullable token,
                                                        NSError * _Nullable error) {
    // ...
}];