1. บทนำ
คุณสามารถใช้ Firebase App Check กับ App Attest เพื่อปกป้องบริการแบ็กเอนด์ของคุณและตรวจสอบว่าคำขอไปยังบริการ Firebase นั้นมาจากแอปจริงของคุณ
โดยทั่วไป แนะนำให้ค่อยๆ แนะนำให้ผู้ใช้เริ่มใช้บริการ App Attest เพื่อหลีกเลี่ยงการใช้โควต้าเกินขีดจำกัด สำหรับข้อมูลเพิ่มเติม โปรดดูเอกสารประกอบ " การเตรียมใช้งาน App Attest Service " ของ Apple
ความสามารถในการเผยแพร่การอัปเดตแอปแบบค่อยเป็นค่อยไปโดยใช้คุณลักษณะ App Store Connect ของ Apple ตามที่อธิบายไว้ใน " การเผยแพร่การอัปเดตเวอร์ชันเป็นระยะๆ " สามารถทำให้การเปิดตัว App Check ราบรื่นขึ้น นี่เป็นวิธีแก้ปัญหาง่ายๆ อย่างไรก็ตาม การเผยแพร่การอัปเดตเวอร์ชันแอปเป็นขั้นๆ ไม่อนุญาตให้คุณควบคุมการเปิดตัวหรือเปลี่ยนแปลงพฤติกรรมของแอปที่มีอยู่และอัปเดตโดยไม่ต้องเผยแพร่แอปเวอร์ชันใหม่
วิธีหนึ่งที่จะควบคุมการเปิดตัว App Check with App Attest ได้มากขึ้นคือการใช้ Firebase Remote Config เพื่อเปิดใช้ App Check with App Attest สำหรับเปอร์เซ็นต์ของผู้ใช้แอปในแต่ละครั้ง สิ่งนี้อาจช่วยหลีกเลี่ยงการควบคุมปริมาณจากเซิร์ฟเวอร์การรับรอง สามารถใช้ Google Analytics เพื่อสังเกตผลกระทบของการเปิดตัวต่อผู้ใช้
สิ่งที่คุณจะได้เรียนรู้
ใน Codelab แบบหลายขั้นตอนนี้ คุณจะได้เรียนรู้วิธีใช้ Firebase Remote Config เพื่อเปิดตัว App Check สำหรับแอปของคุณ
Codelab นี้ใช้โปรเจ็กต์ Firebase ที่อิงตามแอป Quickstart DatabaseExample และรวมเข้ากับ Firebase App Check ตามที่อธิบายไว้ใน Codelab ของ Firebase App Check สำหรับ Apple Platforms แอป Quickstart DatabaseExample ช่วยให้ผู้ใช้เข้าสู่ระบบและเพิ่มโพสต์โดยใช้คุณสมบัติของ Firebase Realtime Database
คุณยังสามารถปรับขั้นตอนใน Codelab นี้เพื่อทดสอบแอปของคุณเอง
ข้อกำหนดเบื้องต้น
สิ่งที่คุณต้องการ
- Xcode 12.5+
- สำหรับการทดสอบ App Attest:
- บัญชี Apple Developer ที่ให้คุณสร้างตัวระบุแอพใหม่
- แอปพลิเคชันที่มี ID แอปที่ชัดเจนและเปิดใช้งานความสามารถ App Attest ดูบทความ การลงทะเบียนรหัสแอป และ เปิดใช้งานความสามารถของแอป หากคุณต้องการความช่วยเหลือเกี่ยวกับกระบวนการนี้
- อุปกรณ์ iOS/iPadOS ที่รองรับ App Attest
- โครงการ Firebase ด้วย:
- แอป iOS ที่กำหนดค่า ( เรียนรู้เพิ่มเติม )
- เปิดใช้งาน Google Analytics , Remote Config และ App Check
- เข้าถึงโปรเจ็กต์ Firebase ที่เชื่อมโยงกับแอปของคุณ โดยมีสิทธิ์ในการสร้างและจัดการการกำหนดค่าระยะไกลและดู Google Analytics
2. สร้างผู้ให้บริการรับรองที่กำหนดเอง
ในขั้นตอนนี้ เราจะสร้างคลาสผู้ให้บริการแบบกำหนดเองเพื่อจัดเตรียมโทเค็นเมื่อเปิดใช้งาน App Attest เท่านั้น การกำหนดค่าระยะไกลอาศัยอินสแตนซ์ของแอป Firebase ที่กำหนดค่าไว้ และผู้ให้บริการแบบกำหนดเองที่คุณใช้ในขั้นตอนนี้ทำหน้าที่เป็นตัวยึดตำแหน่งเพื่อเสร็จสิ้นการกำหนดค่า
ในการทำตามขั้นตอนต่อไปนี้ คุณจะต้องเพิ่ม Firebase
, FirebaseRemoteConfig
และ FirebaseAnalytics
ใน ส่วน Frameworks, Libraries และ Embedded Content ของแอปของคุณใน Xcode สำหรับตัวอย่างวิธีการ โปรดดู การตรวจสอบแอป Firebase สำหรับ Codelab ของแพลตฟอร์ม Apple
- สร้างไฟล์ " MyAppCheckProvider " ซึ่งเป็นคลาสย่อยของ
NSObject
ที่สอดคล้องกับโปรโตคอลAppCheckProvider
- รวมเมธอด
getToken()
ว่างที่คุณจะกรอกในภายหลัง
ดูโค้ดตัวอย่างต่อไปนี้สำหรับคลาสผู้ให้บริการที่กำหนดเองด้วยเมธอด getToken()
ที่ว่างเปล่า
// MyAppCheckProvider.swift
import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig
class MyAppCheckProvider: NSObject, AppCheckProvider {
func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}
ในการยกตัวอย่าง AppAttestProvider
คุณจะต้องผ่านอินสแตนซ์ของ FirebaseApp
ที่เกี่ยวข้อง สร้างคุณสมบัติที่เก็บไว้และยอมรับเป็นพารามิเตอร์ initializer:
// MyAppCheckProvider.swift
import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig
class MyAppCheckProvider: NSObject, AppCheckProvider {
// Firebase app instance served by the provider.
let firebaseApp: FirebaseApp
// The App Check provider factory should pass the FirebaseApp instance.
init(app: FirebaseApp) {
self.firebaseApp = app
super.init()
}
func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}
ส่งต่อคำขอโทเค็นไปยังผู้ให้บริการ App Attest
ตอนนี้คุณมีทุกอย่างที่จะส่งต่อคำขอโทเค็นไปยังผู้ให้บริการ App Attest ในเมธอด getToken()
ของคุณ
หมายเหตุ: เรียนรู้เพิ่มเติมเกี่ยวกับเมธอด getToken()
ใน FirebaseAppCheck Framework Reference
เพิ่มรหัสต่อไปนี้ในเมธอด getToken()
ของคุณ:
// MyAppCheckProvider.swift
import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig
class MyAppCheckProvider: NSObject, AppCheckProvider {
// Firebase app instance served by the provider.
let firebaseApp: FirebaseApp
// The App Check provider factory should pass the FirebaseApp instance.
init(app: FirebaseApp) {
self.firebaseApp = app
super.init()
}
private lazy var appAttestProvider = AppAttestProvider(app: firebaseApp)
func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
// Fetch App Attest flag from Remote Config
let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
remoteConfig.fetchAndActivate { remoteConfigStatus, error in
// Get App Attest flag value
let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue
guard appAttestEnabled else {
// Skip attestation if App Attest is disabled. Another attestation
// method like DeviceCheck may be used instead of just skipping.
handler(nil, MyProviderError.appAttestIsDisabled)
return
}
// Try to obtain an App Attest provider instance and fail if cannot
guard let appAttestProvider = self.appAttestProvider else {
handler(nil, MyProviderError.appAttestIsUnavailable)
return
}
// If App Attest is enabled for the app instance, then forward the
// Firebase App Check token request to the App Attest provider
appAttestProvider.getToken(completion: handler)
}
}
}
enum MyProviderError: Error {
case appAttestIsDisabled
case appAttestIsUnavailable
case unexpected(code: Int)
}
โค้ดก่อนหน้านี้ตรวจสอบพารามิเตอร์บูลีน AppAttestEnabled
Remote Config (พารามิเตอร์ Remote Config นี้จะสร้างขึ้นภายหลังใน Codelab) หากค่าเป็นเท็จ รหัสจะล้มเหลว ซึ่งบ่งชี้ว่าการตรวจสอบแอปไม่ได้เริ่มใช้งานในอุปกรณ์ปัจจุบัน หากค่าเป็นจริง รหัสจะพยายามขอรับผู้ให้บริการ App Attest และจะล้มเหลวหากไม่สามารถ หากผ่านการตรวจสอบข้อผิดพลาดเหล่านี้ รหัสจะส่งต่อคำขอโทเค็นไปยังผู้ให้บริการ App Attest
เพิ่มเหตุการณ์ Analytics
เมื่อเพิ่มเหตุการณ์ Analytics คุณจะได้รับข้อมูลเชิงลึกที่ดีขึ้นว่าการเปิดตัว App Check ประสบความสำเร็จเพียงใด การวิเคราะห์จะช่วยตัดสินว่าควรเปิดใช้ App Attest สำหรับผู้ชมจำนวนมากขึ้นหรือไม่
บันทึกเหตุการณ์ Analytics สองเหตุการณ์: AppAttestSuccess เมื่อสำเร็จ และ AppAttestFailure เมื่อล้มเหลว เหตุการณ์ Analytics ทั้งสองนี้สามารถช่วยติดตามความสำเร็จของการเปิดตัว App Check และช่วยให้คุณตัดสินใจได้ว่าควรเปิดตัวขนาดใหญ่ขึ้นต่อไปหรือไม่
func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
// Fetch Remote Config.
let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
remoteConfig.fetchAndActivate { remoteConfigStatus, error in
// Get App Attest flag value from Remote Config.
let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue
guard appAttestEnabled else {
// Skip attestation if App Attest is disabled. Another attestation
// method like DeviceCheck may be used instead of just skipping.
handler(nil, MyProviderError.appAttestIsDisabled)
return
}
// Try to obtain an App Attest provider instance and fail otherwise.
guard let appAttestProvider = self.appAttestProvider else {
handler(nil, MyProviderError.appAttestIsUnavailable)
return
}
// If App Attest is enabled for the app instance, then forward the
// Firebase App Check token request to the App Attest provider.
appAttestProvider.getToken { token, error in
// Log an Analytics event to track attestation success rate.
let appAttestEvent: String
if (token != nil && error == nil) {
appAttestEvent = "AppAttestSuccess"
} else {
appAttestEvent = "AppAttestFailure"
}
Analytics.logEvent(appAttestEvent, parameters: nil)
// Pass the result to the handler
handler(token, error)
}
}
}
3. อัปเดตคลาส Provider Factory
หลังจากที่คุณใช้ตรรกะเพื่อส่งต่อคำขอโทเค็นไปยังผู้ให้บริการ App Attest และเพิ่มเหตุการณ์ Analytics บางอย่างแล้ว คุณต้องอัปเดต MyAppCheckProviderFactory.class
ซึ่งคุณสร้างไว้ใน Codelab ของ App Check สำหรับ Apple Platforms คลาสนี้จะกำหนดเป้าหมาย ผู้ให้บริการแก้ไขข้อบกพร่องของ App Check สำหรับเครื่องจำลอง และกำหนดเป้าหมายผู้ให้บริการที่กำหนดเองของคุณ
แก้ไขโค้ดต่อไปนี้ในคลาส MyAppCheckProviderFactory
ที่คุณสร้างใน Codelab ของ Firebase App Check สำหรับแพลตฟอร์ม Apple :
// MyAppCheckProviderFactory.swift
import Firebase
class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
#if targetEnvironment(simulator)
// App Attest is not available on simulators.
// Use a debug provider.
let provider = AppCheckDebugProvider(app: app)
// Print only locally generated token to avoid a valid token leak on CI.
print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")
return provider
#else
if #available(iOS 14.0, *) {
// Use your custom App Attest provider on real devices.
return MyAppCheckProvider(app: app)
} else {
return DeviceCheckProvider(app: app)
}
#endif
}
}
ยืนยันว่าคุณได้ตั้งค่า AppCheckProviderFactory
ก่อนกำหนดค่า FirebaseApp
:
// DatabaseExampleApp.swift
import SwiftUI
import Firebase
import FirebaseAppCheck
@main
struct DatabaseExampleApp: App {
init() {
AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
FirebaseApp.configure()
}
// ...
}
4. เพิ่มพารามิเตอร์การกำหนดค่าระยะไกลในคอนโซล Firebase
ตอนนี้ คุณจะเพิ่มพารามิเตอร์การกำหนดค่าระยะไกล AppAttestEnabled ไปยังคอนโซล Firebase เมธอด getToken
ของคุณต้องการพารามิเตอร์นี้
วิธีสร้างพารามิเตอร์ Remote Config ในคอนโซล Firebase :
- เปิด การกำหนดค่าระยะไกล สำหรับโครงการของคุณ แล้วคลิก เพิ่มพารามิเตอร์ หากนี่เป็นครั้งแรกที่คุณใช้ Remote Config ให้คลิก Create configuration
- ในฟิลด์ ชื่อพารามิเตอร์ (คีย์) ให้ป้อน
AppAttestEnabled
- จากดรอปดาวน์ ประเภทข้อมูล ให้เลือก บูลีน
- จาก ดรอปดาวน์ค่า เริ่มต้น เลือก เท็จ
ก่อนคลิกบันทึก ให้สร้างมูลค่าตามเงื่อนไขสำหรับผู้ใช้ 10%:
- คลิก เพิ่มใหม่ > ค่าเงื่อนไข > สร้างเงื่อนไขใหม่
- ในฟิลด์ ชื่อ ให้ป้อนชื่อเงื่อนไข
- ภายใต้ ใช้ if... เลือก ผู้ใช้ในเปอร์เซ็นต์ไทล์สุ่ม <= แล้วป้อน 10 ในฟิลด์ %
- คลิก สร้างเงื่อนไข
ตั้งค่าเงื่อนไขเป็น จริง เพื่อให้ App Attest ใช้งานได้กับผู้ใช้ 10%
- ตั้งค่าเป็น จริง สำหรับเงื่อนไขที่คุณเพิ่งสร้างขึ้น
- คลิก บันทึก
เมื่อคุณทำเสร็จแล้ว ให้เผยแพร่การเปลี่ยนแปลงการกำหนดค่าระยะไกล
ทดสอบการเปิดตัวบนอุปกรณ์ของคุณ
หากต้องการทดสอบค่าแฟล็กการกำหนดค่าระยะไกลที่แตกต่างกันบนอุปกรณ์ของคุณโดยไม่แก้ไขโค้ดแอป ให้กำหนดค่าการทดสอบบนพารามิเตอร์ AppAttestEnabled ตาม บทช่วยสอนสร้างการทดสอบการกำหนดค่าระยะไกลของ Firebase ด้วย A/B Testing ส่วนบทช่วยสอน " ตรวจสอบความถูกต้องของการทดสอบบนอุปกรณ์ทดสอบ " อธิบายวิธีกำหนดค่าต่างๆ สำหรับอุปกรณ์ทดสอบของคุณ
ขั้นตอนสุดท้ายคือการใช้ Google Analytics เพื่อตรวจสอบความสำเร็จของการเปิดตัว App Attest
5. ตรวจสอบความสำเร็จของการเปิดตัว AppCheck ของคุณ
คุณสามารถวัดความสำเร็จของการเปิดตัวของคุณได้บนแดชบอร์ดเหตุการณ์ของ Analytics ดูเหตุการณ์ AppAttestSuccess และ AppAttestFailure อาจใช้เวลาถึง 24 ชั่วโมงเพื่อดูเหตุการณ์ในแดชบอร์ด หรือคุณสามารถเปิดใช้งานการแก้ไขข้อบกพร่องและใช้ DebugView เพื่อดูเหตุการณ์การแก้ไขข้อบกพร่องได้รวดเร็วยิ่งขึ้น
คุณสามารถตรวจสอบแดชบอร์ด Crashlytics เพื่อเพิ่มอัตราการหยุดทำงาน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่ม Crashlytics ในแอปของคุณ โปรดดูที่ การเริ่มต้นใช้งาน Firebase Crashlytics
เมื่อคุณเห็นเหตุการณ์ AppAttestSuccess เป็นส่วนใหญ่และเหตุการณ์ AppAttestFailure เพียงเล็กน้อย ก็เป็นสัญญาณที่ดีว่าคุณสามารถเพิ่มเปอร์เซ็นต์ของผู้ใช้ที่เปิดใช้งาน App Attest ได้โดยการแก้ไขเงื่อนไขในพารามิเตอร์ Remote Config AppAttestEnabled
ทางเลือก: ใช้ประโยชน์จากผู้ชม Google Analytics
หากคุณต้องการใช้ประโยชน์จากเหตุการณ์ AppAttestEnabled Analytics มากขึ้น คุณสามารถสร้าง Analytics Audience เพื่อติดตามผู้ใช้โดยตั้งค่า AppAttestEnabled เป็น True
App Attest เปิดตัวพร้อมกับ iOS 14.0 ผู้ใช้ของคุณบางรายอาจไม่ได้อยู่ในรุ่นนี้ จึงไม่มีสิทธิ์ได้รับ App Attest คุณสามารถบันทึกเหตุการณ์ Analytics อื่นเพื่อติดตามผู้ใช้เหล่านี้ จากนั้นกำหนดเป้าหมายผู้ชมนั้นสำหรับวิธีการรับรองอื่น เช่น DeviceCheck
ไม่บังคับ: ใช้ Crashlytics เพื่อตรวจสอบข้อขัดข้อง
เพื่อให้เข้าใจความเสถียรของแอประหว่างการเปิดตัวได้ดียิ่งขึ้น ให้ใช้ Firebase Crashlytics เพื่อตรวจสอบข้อขัดข้องและไม่ร้ายแรง
6. ยินดีด้วย!
คุณเปิดตัว App Check ด้วย Remote Config สำเร็จแล้ว 🎉