在 Apple 平台上使用 App Check 保護自訂後端資源

您可以使用 App Check 保護應用程式的非 Google 自訂後端資源,例如自行託管的後端。如要這麼做,請完成下列兩項操作:

  • 修改應用程式用戶端,以便在向後端傳送每個要求時一併傳送 App Check 權杖,如本頁所述。
  • 修改後端,要求每項要求都必須提供有效的 App Check 權杖,詳情請參閱「驗證自訂後端的 App Check 權杖」。

事前準備

使用 App Attest、DeviceCheck 或自訂供應商,將 App Check 新增至應用程式。

透過後端要求傳送 App Check 權杖

為確保後端要求包含有效且未過期的 App Check 權杖,請將每項要求包裝在 AppCheck.token() 呼叫中。App Check 程式庫會視需要重新整理權杖,您可以在方法完成區塊中存取權杖。

取得有效權杖後,請將權杖和要求一併傳送至後端。具體做法由您決定,但請勿將 App Check 權杖做為網址的一部分傳送 (包括在查詢參數中),否則權杖可能會意外外洩或遭到攔截。以下範例會在自訂 HTTP 標頭中傳送權杖,這是建議的做法。

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

重放攻擊防護機制 (Beta 版)

向已啟用重送保護的端點提出要求時,請將要求包裝在對 limitedUseToken() 的呼叫中,而非 token():

Swift

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

Objective-C

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