از منابع باطن سفارشی با App Check در پلتفرم های اپل محافظت کنید

شما می‌توانید از App Check برای محافظت از منابع بک‌اند سفارشی غیرگوگلی برنامه خود، مانند بک‌اند میزبانی‌شده توسط خودتان، استفاده کنید. برای انجام این کار، باید هر دو کار زیر را انجام دهید:

  • کلاینت برنامه خود را طوری تغییر دهید که یک توکن App Check به همراه هر درخواست به backend شما ارسال کند، همانطور که در این صفحه توضیح داده شده است.
  • همانطور که در بخش «تأیید توکن‌های App Check از یک بک‌اند سفارشی» توضیح داده شده است، بک‌اند خود را طوری تغییر دهید که برای هر درخواست، یک توکن App Check معتبر لازم باشد.

قبل از اینکه شروع کنی

با استفاده از App Attest ، DeviceCheck یا یک ارائه‌دهنده سفارشی ، App Check به برنامه خود اضافه کنید.

ارسال توکن‌های App Check با درخواست‌های backend

برای اطمینان از اینکه درخواست‌های backend شما شامل یک توکن App Check معتبر و منقضی نشده هستند، هر درخواست را در فراخوانی AppCheck.token() قرار دهید. کتابخانه App Check در صورت لزوم توکن را به‌روزرسانی می‌کند و شما می‌توانید در بلوک تکمیل متد به توکن دسترسی داشته باشید.

وقتی یک توکن معتبر داشتید، آن را همراه با درخواست به backend خود ارسال کنید. جزئیات نحوه انجام این کار به خودتان بستگی دارد، اما توکن‌های App Check به عنوان بخشی از URLها، از جمله در پارامترهای پرس‌وجو، ارسال نکنید ، زیرا این کار آنها را در برابر نشت و رهگیری تصادفی آسیب‌پذیر می‌کند. مثال زیر توکن را در یک هدر HTTP سفارشی ارسال می‌کند که رویکرد توصیه شده است.

سویفت

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
}

هدف-سی

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

محافظت در برابر تکرار (بتا)

هنگام ارسال درخواست به یک نقطه پایانی که برای آن محافظت در برابر پخش مجدد را فعال کرده‌اید، درخواست را به جای token() limitedUseToken() ) قرار دهید:

سویفت

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

هدف-سی

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