1. บทนำ
คุณสามารถใช้ Firebase App Check กับ App Attest เพื่อปกป้องบริการแบ็กเอนด์ของคุณและตรวจสอบว่าคำขอไปยังบริการ Firebase มาจากแอปที่แท้จริงของคุณ
โดยทั่วไปขอแนะนำให้ผู้ใช้เริ่มใช้งานบริการ App Attest ทีละน้อยเพื่อหลีกเลี่ยงการใช้โควต้าเกินขีดจำกัด สำหรับข้อมูลเพิ่มเติม โปรดดูเอกสารประกอบ " การเตรียมใช้บริการ App Attest Service " ของ Apple
ความสามารถในการเผยแพร่การอัปเดตแอปแบบค่อยเป็นค่อยไปโดยใช้คุณลักษณะ App Store Connect ของ Apple ดังที่อธิบายไว้ใน " การเผยแพร่การอัปเดตเวอร์ชันเป็นระยะ " สามารถทำให้การเปิดตัว App Check ราบรื่นยิ่งขึ้น นี่เป็นวิธีแก้ปัญหาที่ตรงไปตรงมาและเรียบง่าย อย่างไรก็ตาม การเผยแพร่การอัปเดตเวอร์ชันของแอปเป็นระยะจะไม่อนุญาตให้คุณควบคุมการเปิดตัวหรือการเปลี่ยนแปลงลักษณะการทำงานของแอปที่มีอยู่และอัปเดตโดยไม่ต้องเผยแพร่แอปเวอร์ชันใหม่
วิธีหนึ่งในการควบคุมการเปิดตัว App Check ด้วย App Attest ได้มากขึ้นคือการใช้ Firebase Remote Config เพื่อเปิดใช้ App Check ด้วย App Attest สำหรับผู้ใช้แอปเป็นเปอร์เซ็นต์ในแต่ละครั้ง ซึ่งอาจช่วยหลีกเลี่ยงการควบคุมปริมาณจากเซิร์ฟเวอร์การรับรอง Google Analytics สามารถใช้เพื่อสังเกตผลกระทบของการเปิดตัวที่มีต่อผู้ใช้
สิ่งที่คุณจะได้เรียนรู้
ใน Codelab แบบหลายขั้นตอนนี้ คุณจะได้เรียนรู้วิธีใช้การกำหนดค่าระยะไกลของ Firebase เพื่อเปิดตัว App Check สำหรับแอปของคุณ
Codelab นี้ใช้โปรเจ็กต์ Firebase ตามแอปเริ่มต้นอย่างรวดเร็ว DatabaseExample และผสานรวมกับ Firebase App Check ตามที่อธิบายไว้ใน Codelab ของ Firebase App Check สำหรับ Apple Platforms แอปเริ่มต้นอย่างรวดเร็ว DatabaseExample อนุญาตให้ผู้ใช้เข้าสู่ระบบและเพิ่มโพสต์โดยใช้คุณสมบัติของฐานข้อมูลเรียลไทม์ Firebase
คุณยังปรับขั้นตอนใน Codelab นี้เพื่อทดสอบแอปของคุณเองได้อีกด้วย
ข้อกำหนดเบื้องต้น
สิ่งที่คุณต้องการ
- Xcode 12.5+
- สำหรับการทดสอบ App Attest:
- บัญชี Apple Developer ที่ให้คุณสร้างตัวระบุแอพใหม่ได้
- แอปพลิเคชันที่มี App ID ที่ชัดเจนและเปิดใช้งานความสามารถ App Attest ดูบทความ ลงทะเบียน ID แอป และ เปิดใช้งานความสามารถของแอป หากคุณต้องการความช่วยเหลือในกระบวนการนี้
- อุปกรณ์ iOS/iPadOS ที่รองรับ App Attest
- โครงการ Firebase พร้อมด้วย:
- กำหนดค่าแอป iOS แล้ว ( เรียนรู้เพิ่มเติม )
- เปิดใช้งาน Google Analytics , การกำหนดค่าระยะไกล และ การตรวจสอบแอป
- เข้าถึงโปรเจ็กต์ Firebase ที่เกี่ยวข้องของแอปของคุณ พร้อมสิทธิ์ในการสร้างและจัดการการกำหนดค่าระยะไกล และดู Google Analytics
2. สร้างผู้ให้บริการรับรองแบบกำหนดเอง
ในขั้นตอนนี้ เราจะสร้างคลาสผู้ให้บริการที่กำหนดเองเพื่อมอบโทเค็นเมื่อเปิดใช้งาน App Attest เท่านั้น การกำหนดค่าระยะไกลอาศัยอินสแตนซ์แอป Firebase ที่กำหนดค่าไว้ และผู้ให้บริการแบบกำหนดเองที่คุณใช้ในขั้นตอนนี้ทำหน้าที่เป็นตัวยึดตำแหน่งเพื่อสิ้นสุดการกำหนดค่า
เพื่อทำตามขั้นตอนต่อไปนี้ให้เสร็จสิ้น คุณจะต้องเพิ่ม Firebase
, FirebaseRemoteConfig
และ FirebaseAnalytics
ใน ส่วนเฟรมเวิร์ก ไลบรารี และเนื้อหาแบบฝัง ของแอปของคุณใน 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
ที่เกี่ยวข้อง สร้างคุณสมบัติที่เก็บไว้และยอมรับเป็นพารามิเตอร์เริ่มต้น:
// 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)
}
โค้ดก่อนหน้านี้จะตรวจสอบพารามิเตอร์บูลีน Remote Config AppAttestEnabled
(พารามิเตอร์การกำหนดค่าระยะไกลนี้จะถูกสร้างขึ้นในภายหลังใน Codelab) หากค่าเป็นเท็จ โค้ดจะล้มเหลว แสดงว่ายังไม่ได้เปิดตัว App Check บนอุปกรณ์ปัจจุบัน หากค่าเป็นจริง รหัสจะพยายามรับผู้ให้บริการ App Attest และจะล้มเหลวหากไม่สามารถทำได้ หากผ่านการตรวจสอบข้อผิดพลาดเหล่านี้ โค้ดจะส่งต่อคำขอโทเค็นไปยังผู้ให้บริการ App Attest
เพิ่มเหตุการณ์ Analytics
การเพิ่มเหตุการณ์ Analytics จะทำให้คุณได้รับข้อมูลเชิงลึกที่ดีขึ้นว่าการเปิดตัว App Check ประสบความสำเร็จเพียงใด Analytics จะช่วยพิจารณาว่าควรเปิดใช้ 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
ที่คุณสร้างใน Firebase App Check สำหรับแพลตฟอร์ม Codelab ของ 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
ตอนนี้คุณจะเพิ่มพารามิเตอร์ Remote Config AppAttestEnabled ให้กับคอนโซล Firebase เมธอด getToken
ของคุณต้องใช้พารามิเตอร์นี้
วิธีสร้างพารามิเตอร์การกำหนดค่าระยะไกลในคอนโซล Firebase:
- เปิด การกำหนดค่าระยะไกล สำหรับโปรเจ็กต์ของคุณแล้วคลิก เพิ่มพารามิเตอร์ หากนี่เป็นครั้งแรกที่คุณใช้ Remote Config ให้คลิก Create configuration
- ในฟิลด์ ชื่อพารามิเตอร์ (คีย์) ให้ป้อน
AppAttestEnabled
- จากเมนูแบบเลื่อนลง ประเภทข้อมูล ให้เลือก บูลีน
- จากดรอปดาวน์ ค่าเริ่ม ต้น ให้เลือก เท็จ
ก่อนที่จะคลิกบันทึก ให้สร้างค่าตามเงื่อนไขสำหรับผู้ใช้ 10%:
- คลิก เพิ่มใหม่ > ค่าตามเงื่อนไข > สร้างเงื่อนไขใหม่
- ในฟิลด์ ชื่อ ให้ป้อนชื่อเงื่อนไข
- ภายใต้ ใช้ถ้า... ให้เลือก ผู้ใช้ในรูปแบบเปอร์เซ็นไทล์แบบสุ่ม <= จากนั้นป้อน 10 ในฟิลด์ %
- คลิก สร้างเงื่อนไข
ตั้งค่าตามเงื่อนไขเป็น จริง เพื่อให้ App Attest เปิดตัวแก่ผู้ใช้ 10%
- ตั้งค่าเป็น จริง สำหรับเงื่อนไขที่คุณเพิ่งสร้างขึ้น
- คลิก บันทึก
เมื่อเสร็จแล้ว ให้เผยแพร่การเปลี่ยนแปลงการกำหนดค่าระยะไกล
ทดสอบการเปิดตัวบนอุปกรณ์ของคุณ
หากต้องการทดสอบค่าแฟล็กการกำหนดค่าระยะไกลต่างๆ บนอุปกรณ์ของคุณโดยไม่ต้องแก้ไขโค้ดของแอป ให้กำหนดค่าการทดสอบบนพารามิเตอร์ AppAttestEnabled ตาม บทแนะนำการสร้างการทดสอบการกำหนดค่าระยะไกลของ Firebase ด้วยการทดสอบ A/B ส่วนบทแนะนำ " ตรวจสอบการทดสอบของคุณบนอุปกรณ์ทดสอบ " อธิบายวิธีกำหนดค่าต่างๆ ให้กับอุปกรณ์ทดสอบของคุณ
ขั้นตอนสุดท้ายคือการใช้ Google Analytics เพื่อติดตามความสำเร็จของการเปิดตัว App Attest
5. ตรวจสอบความสำเร็จของการเปิดตัว AppCheck ของคุณ
คุณสามารถวัดความสำเร็จของการเปิดตัวของคุณได้บนแดชบอร์ดเหตุการณ์ Analytics รับชมเหตุการณ์ AppAttestSuccess และ AppAttestFailure อาจใช้เวลาถึง 24 ชั่วโมงจึงจะเห็นเหตุการณ์ในหน้าแดชบอร์ด หรือคุณสามารถเปิดใช้งานการแก้ไขข้อบกพร่องและใช้ DebugView เพื่อดูเหตุการณ์การแก้ไขข้อบกพร่องได้รวดเร็วยิ่งขึ้น
หรือคุณสามารถตรวจสอบแดชบอร์ด Crashlytics เพื่อเพิ่มอัตราการขัดข้องได้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่ม Crashlytics ลงในแอปของคุณ โปรดดู เริ่มต้นใช้งาน Firebase Crashlytics
เมื่อคุณเห็นเหตุการณ์ AppAttestSuccess เป็นส่วนใหญ่และเหตุการณ์ AppAttestFailure เพียงไม่กี่เหตุการณ์ ถือเป็นสัญญาณที่ดีที่คุณสามารถเพิ่มเปอร์เซ็นต์ของผู้ใช้ที่เปิดใช้งาน App Attest ได้โดยการแก้ไขเงื่อนไขในพารามิเตอร์การกำหนดค่าระยะไกล AppAttestEnabled
ทางเลือก: ใช้ประโยชน์จากผู้ชม Google Analytics
หากคุณต้องการใช้ประโยชน์จากเหตุการณ์ AppAttestEnabled Analytics ต่อไป คุณสามารถสร้าง ผู้ชม Analytics เพื่อติดตามผู้ใช้โดยตั้งค่า AppAttestEnabled เป็นจริง
App Attest เปิดตัวพร้อมกับ iOS 14.0 ผู้ใช้บางรายของคุณอาจไม่อยู่ในรุ่นนี้ จึงไม่มีสิทธิ์รับ App Attest คุณสามารถบันทึกเหตุการณ์ Analytics อื่นเพื่อติดตามผู้ใช้เหล่านี้ จากนั้นกำหนดเป้าหมายผู้ชมนั้นด้วยวิธีการรับรองอื่น เช่น DeviceCheck
ทางเลือก: ใช้ Crashlytics เพื่อติดตามข้อขัดข้อง
เพื่อให้เข้าใจความเสถียรของแอปได้ดีขึ้นระหว่างการเปิดตัว ให้ใช้ Firebase Crashlytics เพื่อตรวจสอบข้อขัดข้องและเหตุการณ์ที่ไม่ร้ายแรง
6. ขอแสดงความยินดี!
คุณเปิดตัว App Check ด้วย Remote Config สำเร็จแล้ว 🎉