ใช้ App Check เพื่อรักษาความปลอดภัยของ Navigation SDK สำหรับ iOS

Firebase App Check ช่วยปกป้องการเรียกใช้จากแอปของคุณไปยัง Google Maps Platform โดยการบล็อกการเข้าชมที่มาจากแหล่งที่มาอื่นที่ไม่ใช่แอปที่ถูกต้องตามกฎหมาย โดยจะดำเนินการนี้ด้วยการขอให้ผู้ให้บริการยืนยันตัวตน เช่น App Attest ประเมินความถูกต้องของแอปหรืออุปกรณ์ เมื่อผสานรวมแอปกับ App Check คุณจะเพิ่มการป้องกันคำขอที่เป็นอันตรายและไม่ได้รับอนุญาต ซึ่งจะช่วยปกป้องการเรียกเก็บเงินจากการเรียกเก็บเงินที่ไม่ได้รับอนุญาต นอกจากนี้ App Check ยังช่วยปรับปรุงการรายงานการหยุดชะงักแบบเรียลไทม์ในระบบนิเวศของแอปสำหรับกองยานอย่างมาก ซึ่งเป็นประโยชน์ต่อผู้ขับขี่ทุกคนที่ใช้แอปของคุณ ดูข้อมูลเพิ่มเติมได้ที่การรายงานการหยุดชะงัก

เหตุใดจึงควรใช้ App Check

App Check จะปกป้อง Navigation SDK สำหรับ iOS ใน 2 ส่วนที่แตกต่างกัน ได้แก่ ฟังก์ชันการทำงานหลักของการนำทางและการรายงานการหยุดชะงัก

App Check ช่วยบล็อกคำขอหลักของ Navigation SDK สำหรับ iOS จากแหล่งที่มาที่เป็นอันตรายหรือไม่ได้รับอนุญาต ซึ่งเป็นประโยชน์ต่อคุณโดยตรงด้วยการปกป้องโปรเจ็กต์จากการฉ้อโกงในการเรียกเก็บเงินและการใช้โควต้าจนหมด

การรายงานการหยุดชะงัก

เราขอแนะนำให้ใช้ App Check หากแอปของคุณรองรับการรายงานการหยุดชะงักแบบเรียลไทม์และความสามารถในการโหวต การเปิดใช้ App Check จะช่วยให้ผู้ขับขี่ได้รับเส้นทางที่แม่นยำที่สุดซึ่งพิจารณาจากความคิดเห็นแบบเรียลไทม์ทั้งหมด

เหตุผลที่ App Check มีความสำคัญต่อการรายงาน

  • เกณฑ์ความน่าเชื่อถือสูงสำหรับการปิด: เหตุการณ์ที่ส่งผลต่อเส้นทาง เช่น การปิดถนน อาจเปลี่ยนแปลงลักษณะการทำงานของการกำหนดเส้นทางสำหรับผู้ขับขี่ทุกคนอย่างมาก โครงสร้างพื้นฐานการกลั่นกรองของ Google สำหรับการหยุดชะงักเนื่องจากการปิดถนนอาศัยสัญญาณความสมบูรณ์ของอุปกรณ์และแอปที่แข็งแกร่งเพื่อปกป้องแผนที่จากการก่อกวน สแปม หรือการรายงานที่ไม่ถูกต้อง
  • วิธีที่ App Check ตรวจสอบรายงาน: รายงานและการโหวตของผู้ใช้ที่ส่งจาก Navigation SDK สำหรับ iOS จะมีโทเค็น App Check ซึ่งแบ็กเอนด์ของ Google ใช้เพื่อตรวจสอบความถูกต้องของความคิดเห็น ซึ่งจะเพิ่มระดับความน่าเชื่อถือและอนุญาตให้ประเมินผลกระทบต่อแผนที่สดได้
  • ผลกระทบของการละเว้น App Check: ระบบจะประเมินรายงานที่ส่งโดยไม่มีโทเค็น App Check ที่ถูกต้องภายใต้โมเดลความน่าเชื่อถือที่ต่ำกว่า และอาจประมวลผลเป็นสัญญาณเงียบเท่านั้น ซึ่งหมายความว่าแม้ว่าผู้ใช้จะยังคงรายงานและโหวตได้ แต่รายงานของผู้ใช้มีแนวโน้มที่จะไม่ปรากฏบนแผนที่หรือส่งผลต่อเส้นทางของผู้ขับขี่รายอื่น และจะต้องมีการตรวจสอบเพิ่มเติม

App Check เหมาะกับฉันไหม

เราขอแนะนำให้ใช้ App Check ในกรณีส่วนใหญ่ แต่ไม่จำเป็นต้องใช้หรือระบบไม่รองรับ App Check ในสถานการณ์ต่อไปนี้

  • แอปส่วนตัวหรือแอปทดลอง: หากแอปของคุณไม่สามารถเข้าถึงได้แบบสาธารณะ ก็ไม่จำเป็นต้องใช้ App Check
  • อุปกรณ์ที่ถูกบุกรุก: ผู้ให้บริการเอกสารรับรองที่เราแนะนำจะป้องกันไม่ให้ Navigation SDK สำหรับ iOS ทำงานในอุปกรณ์ที่ไม่น่าเชื่อถือ เช่น โทรศัพท์ที่รูทหรือเจลเบรคแล้ว หากต้องการรองรับอุปกรณ์เหล่านี้ ให้ติดตั้งใช้งานผู้ให้บริการยืนยันตัวตนที่กำหนดเอง

ภาพรวมของขั้นตอนการติดตั้งใช้งาน

โดยรวมแล้ว คุณจะต้องทำตามขั้นตอนต่อไปนี้เพื่อผสานรวมแอปกับ App Check

  1. เพิ่ม Firebase ไปยังแอป
  2. เพิ่มไลบรารี App Check และเริ่มต้น App Check
  3. เพิ่มผู้ให้บริการโทเค็น ขั้นตอนนี้จะเรียกใช้ผู้ให้บริการยืนยันตัวตนที่คุณเลือกเพื่อตรวจสอบความสมบูรณ์ของอุปกรณ์หรือแอป
  4. เริ่มต้น API ของ Navigation และ App Check
  5. เปิดใช้การแก้ไขข้อบกพร่อง ซึ่งมีประโยชน์ระหว่างการพัฒนาหรือในสภาพแวดล้อมการรวมอย่างต่อเนื่อง (CI)
  6. ตรวจสอบคำขอของแอปก่อนเปิดใช้การบังคับใช้ วิธีนี้จะช่วยให้คุณบังคับใช้ App Check ได้อย่างราบรื่นโดยไม่ขัดขวางผู้ใช้

ข้อควรพิจารณาเมื่อวางแผนการผสานรวม App Check

  • โควต้าของผู้ให้บริการยืนยันตัวตน: ผู้ให้บริการยืนยันตัวตนที่เราแนะนำ ได้แก่ DeviceCheck หรือ App Attest จะขึ้นอยู่กับโควต้าและข้อจำกัดที่ Apple กำหนด
  • เวลาในการเริ่มต้นระบบ: ในสถานการณ์ส่วนใหญ่ ผู้ใช้จะไม่พบความหน่วงแฝงระหว่างการใช้งานปกติ เนื่องจากระบบจะแคชโทเค็น App Check ไว้ในอุปกรณ์ ระบบจะรีเฟรชโทเค็น App Check โดยอัตโนมัติในเบื้องหลังก่อนที่โทเค็นจะหมดอายุเพื่อรักษาประสิทธิภาพการทำงานที่ราบรื่น อย่างไรก็ตาม หากไม่มีโทเค็น App Check ที่ถูกต้อง ผู้ใช้แอปจะพบความหน่วงแฝงเล็กน้อยเมื่อเริ่มต้นระบบ เช่น ความหน่วงแฝงนี้จะเกิดขึ้นระหว่างการเริ่มต้นระบบแบบเย็นเมื่อโทเค็นที่แคชไว้หมดอายุหรือหายไป
  • TTL ของโทเค็น: Time to Live (TTL) จะกำหนดระยะเวลาที่โทเค็น App Check จะใช้งานได้ก่อนที่จะต้องรีเฟรช คุณสามารถกำหนดค่าระยะเวลานี้ได้ตั้งแต่ 30 นาทีถึง 7 วันในคอนโซล Firebase เราขอแนะนำให้กำหนดระยะเวลา 1 ชั่วโมงเป็นระยะเวลาพื้นฐานที่ปลอดภัย แต่ SDK จะพยายามรีเฟรชในเบื้องหลังโดยอัตโนมัติเมื่อผ่านไปประมาณครึ่งหนึ่งของระยะเวลา TTL ดูวิธีการทีละขั้นตอนในคอนโซลได้ในเอกสารประกอบเกี่ยวกับ Firebase App Check

ผสานรวมแอปกับ App Check

ข้อกำหนดเบื้องต้นและข้อกำหนด

  • แอปที่ติดตั้ง Navigation SDK สำหรับ iOS เวอร์ชัน 11.0 ขึ้นไป
  • รหัสชุดของแอป
  • รหัสทีมจากแท็บการเป็นสมาชิกในคอนโซลนักพัฒนาแอปของ Apple
  • หากวางแผนที่จะใช้ DeviceCheck ให้เตรียมไฟล์คีย์ส่วนตัวและรหัสคีย์
  • คุณต้องเป็นเจ้าของแอปในคอนโซล Google Cloud
  • รหัสโปรเจ็กต์ของแอปจากคอนโซล Google Cloud

ขั้นตอนที่ 1: เพิ่ม Firebase ไปยังแอป

ทำตามวิธีการในเอกสารประกอบสำหรับนักพัฒนาแอปของ Firebase เพื่อเพิ่ม Firebase ไปยังแอป เพิ่มไฟล์ GoogleService-Info.plist ที่ไม่ได้แก้ไขลงในระดับรากของโปรเจ็กต์

นำเข้าโมดูลต่อไปนี้ในไฟล์ AppDelegate

Swift

import FirebaseCore
import FirebaseAppCheck
import GoogleNavigation

Objective-C

@import FirebaseCore;
@import FirebaseAppCheck;
@import GoogleNavigation;

ขั้นตอนที่ 2: เพิ่มไลบรารี App Check และเริ่มต้น App Check

Firebase มีวิธีการสำหรับผู้ให้บริการยืนยันตัวตนเริ่มต้นแต่ละราย วิธีการเหล่านี้จะแสดงวิธีตั้งค่าโปรเจ็กต์ Firebase และเพิ่มไลบรารี App Check ลงในแอป ทำตามตัวอย่างโค้ดที่ให้ไว้เพื่อเริ่มต้น App Check

  1. ทำตามวิธีการของ Firebase เพื่อเพิ่มไลบรารี App Check ดังนี้
  2. เริ่มต้น App Check ใน AppDelegate โดยทำดังนี้
    • หากใช้ App Attest ให้สร้างการติดตั้งใช้งาน AppCheckProviderFactory และลงทะเบียนก่อนเรียกใช้ FirebaseApp.configure()

      Swift

      class YourAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
          func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
              return AppAttestProvider(app: app)
          }
      }
      // In application(_:didFinishLaunchingWithOptions:)
      let providerFactory = YourAppCheckProviderFactory()
      AppCheck.setAppCheckProviderFactory(providerFactory)
      FirebaseApp.configure()

      Objective-C

      #import <FirebaseCore/FirebaseCore.h>
      #import <FirebaseAppCheck/FirebaseAppCheck.h>
      
      @interface YourAppCheckProviderFactory : NSObject <FIRAppCheckProviderFactory>
      @end
      
      @implementation YourAppCheckProviderFactory
      - (nullable id<FIRAppCheckProvider>)createProviderWithApp:(FIRApp *)app {
          return [[FIRAppAttestProvider alloc] initWithApp:app];
      }
      @end
      
      // In application:didFinishLaunchingWithOptions:
      YourAppCheckProviderFactory *providerFactory = [[YourAppCheckProviderFactory alloc] init];
      [FIRAppCheck setAppCheckProviderFactory:providerFactory];
      [FIRApp configure];
    • หากใช้ DeviceCheck ให้ตั้งค่า Factory โดยใช้โค้ดต่อไปนี้

      Swift

      AppCheck.setAppCheckProviderFactory(DeviceCheckProviderFactory())

      Objective-C

      FIRDeviceCheckProviderFactory *providerFactory = [[FIRDeviceCheckProviderFactory alloc] init];
      [FIRAppCheck setAppCheckProviderFactory:providerFactory];

ขั้นตอนที่ 3: เพิ่มผู้ให้บริการโทเค็น

สร้างไฟล์ชื่อ AppCheckTokenProvider (หรือหากใช้ Objective-C ให้สร้าง 2 ไฟล์ชื่อ AppCheckTokenProvider.h และ AppCheckTokenProvider.m) ในระดับรากของแอป

คลาสนี้ต้องเป็นไปตามโปรโตคอล GMSAppCheckTokenProvider และติดตั้งใช้งานเมธอด fetchAppCheckTokenWithCompletion

Swift

import Foundation
import FirebaseAppCheck
import GoogleNavigation

class AppCheckTokenProvider: NSObject, GMSAppCheckTokenProvider {
    func fetchAppCheckToken(completion: @escaping (String?, Error?) -> Void) {
        AppCheck.appCheck().token(forcingRefresh: false) { token, error in
            if let error = error {
                print("App Check Error: \(error)")
                completion(nil, error)
                return
            }
            guard let token = token else {
                completion(nil, NSError(domain: "AppCheck", code: -1, userInfo: [NSLocalizedDescriptionKey: "Token is nil"]))
                return
            }
            print("App Check Token: \(token.token)")
            completion(token.token, nil)
        }
    }
}

Objective-C

// AppCheckTokenProvider.h
#import <Foundation/Foundation.h>
#import <GoogleNavigation/GoogleNavigation.h>

NS_ASSUME_NONNULL_BEGIN

@interface AppCheckTokenProvider : NSObject <GMSAppCheckTokenProvider>
@end

NS_ASSUME_NONNULL_END
// AppCheckTokenProvider.m
#import "AppCheckTokenProvider.h"
#import <FirebaseAppCheck/FirebaseAppCheck.h>

@implementation AppCheckTokenProvider
- (void)fetchAppCheckTokenWithCompletion:(void (^)(NSString * _Nullable token, NSError * _Nullable error))completion {
    [[FIRAppCheck appCheck] tokenForcingRefresh:NO
                                     completion:^(FIRAppCheckToken * _Nullable token, NSError * _Nullable error) {
        if (token) {
            completion(token.token, nil);
        } else {
            completion(nil, error);
        }
    }];
}
@end

ขั้นตอนที่ 4: เริ่มต้น API ของ Navigation และ App Check

เริ่มต้น Navigation SDK สำหรับ iOS (โดยใช้ GMSServices) และลงทะเบียนอินสแตนซ์ผู้ให้บริการโทเค็นโดยการแคสต์แฮนเดิลบริการแบบทึบแสงที่แชร์เป็น GMSServices

Swift

// In application(_:didFinishLaunchingWithOptions:)
GMSServices.provideAPIKey("YOUR_API_KEY")

// Register your App Check token provider before initializing Navigation SDK for iOS
if let services = GMSServices.sharedServices() as? GMSServices {
    services.appCheckTokenProvider = AppCheckTokenProvider()
}

Objective-C

// In application:didFinishLaunchingWithOptions:
[GMSServices provideAPIKey:@"YOUR_API_KEY"];

// Register your App Check token provider before initializing Navigation SDK for iOS
((GMSServices *)[GMSServices sharedServices]).appCheckTokenProvider = [[AppCheckTokenProvider alloc] init];

ขั้นตอนที่ 5: เปิดใช้การแก้ไขข้อบกพร่อง (ไม่บังคับ)

หลังจากบังคับใช้ App Check สำหรับ Navigation SDK สำหรับ iOS แล้ว ฟีเจอร์ของแอปที่ขึ้นอยู่กับ Navigation SDK สำหรับ iOS จะไม่ทำงานในโปรแกรมจำลองหรือจากสภาพแวดล้อมการรวมอย่างต่อเนื่อง (CI) เนื่องจากสภาพแวดล้อมเหล่านี้ไม่ผ่านเกณฑ์เป็นอุปกรณ์ที่ถูกต้อง หากต้องการเรียกใช้แอปในสภาพแวดล้อมเหล่านี้ระหว่างการพัฒนาและการทดสอบ คุณต้องสร้างบิลด์การแก้ไขข้อบกพร่องของแอปที่ใช้ผู้ให้บริการการแก้ไขข้อบกพร่องของ App Check แทนผู้ให้บริการยืนยันตัวตนเวอร์ชันที่ใช้งานจริง

  1. กำหนดค่า Factory ของผู้ให้บริการการแก้ไขข้อบกพร่องใน AppDelegate โดยทำดังนี้

    Swift

    #if targetEnvironment(simulator)
    let providerFactory = AppCheckDebugProviderFactory()
    #else
    let providerFactory = YourAppCheckProviderFactory()
    #endif
    AppCheck.setAppCheckProviderFactory(providerFactory)

    Objective-C

    #if TARGET_OS_SIMULATOR
    id<FIRAppCheckProviderFactory> providerFactory = [[FIRAppCheckDebugProviderFactory alloc] init];
    #else
    id<FIRAppCheckProviderFactory> providerFactory = [[YourAppCheckProviderFactory alloc] init];
    #endif
    [FIRAppCheck setAppCheckProviderFactory:providerFactory];
  2. เปิดใช้การบันทึกในโปรเจ็กต์ Xcode, เปิดแอป และค้นหาโทเค็นการแก้ไขข้อบกพร่องในเครื่องในบันทึกของคอนโซล
  3. คัดลอกและเพิ่มโทเค็นการแก้ไขข้อบกพร่องนี้ลงในคอนโซล Firebase ดูรายละเอียดเพิ่มเติมได้ในเอกISTRATIONประกอบเกี่ยวกับผู้ให้บริการการแก้ไขข้อบกพร่องของ Firebase App Check

ขั้นตอนที่ 6: ตรวจสอบคำขอของแอปและตัดสินใจเกี่ยวกับการบังคับใช้

ก่อนเปิดใช้การบังคับใช้ ให้ตรวจสอบคำขอของแอปเพื่อให้แน่ใจว่าคุณจะไม่ขัดขวางผู้ใช้ที่ถูกต้อง

  1. ไปที่หน้าจอเมตริก App Check ในคอนโซล Firebase เพื่อดูเปอร์เซ็นต์การเข้าชมที่ยืนยันแล้วเทียบกับการเข้าชมที่ยังไม่ยืนยัน
  2. เมื่อแน่ใจว่าการเข้าชมส่วนใหญ่ได้รับการยืนยันแล้วและผู้ใช้ที่ถูกต้องได้อัปเดตเป็นแอปเวอร์ชันที่มีการติดตั้งใช้งาน App Check แล้ว ให้เปิดใช้การบังคับใช้
  3. เมื่อเปิดใช้การบังคับใช้แล้ว App Check จะปฏิเสธการเข้าชมทั้งหมดที่ไม่มีโทเค็น App Check ที่ถูกต้อง