Firebaseを利用したFlutterアプリでは、
- Firebase Authentication
- Cloud Firestore
- Cloud Storage
- Cloud Functions
などを簡単に利用できます。
しかし、Firebaseへアクセスできるのは「自分のアプリ」だけとは限りません。
悪意のある第三者が、
- APIを直接叩く
- 改造アプリからアクセスする
- Botで大量リクエストを送る
といった攻撃を行う可能性があります。
そこで活躍するのが Firebase App Check です。
Flutterでは firebase_app_check パッケージを利用することで、正規のアプリからのアクセスのみをFirebaseサービスへ許可できるようになります。
Firebase App Checkとは?
Firebase App Checkは、
「Firebaseへアクセスしているのが本当にあなたのアプリなのか」を検証する仕組みです。
例えば通常の構成では、
Flutterアプリ
↓
Cloud Firestore
となります。
しかしApp Checkを有効化すると、
Flutterアプリ
↓
App Checkトークン取得
↓
Cloud Firestore
という流れになります。
Firebaseは送信されたApp Checkトークンを検証し、
- 正規アプリ
- 改造されていないアプリ
- 正常な実行環境
であることを確認できた場合のみアクセスを許可します。
App Checkで防げること
App Checkを導入することで、次のような不正利用を軽減できます。
- Firebase APIの不正利用
- Botによる大量アクセス
- 改造アプリからのアクセス
- APIキーだけを利用した攻撃
- 不正な課金(Billing Fraud)
なお、App Checkは認証機能ではありません。
ユーザー本人かどうかを確認するのではなく、
「アクセスしているアプリが正規のものか」を確認する機能です。
firebase_app_checkとは?
firebase_app_checkは、FlutterFire公式が提供するFirebase App Check用プラグインです。
Android・iOS・Web・macOS・Windowsに対応しており、Flutterから簡単にApp Checkを利用できます。
インストール
まずは pubspec.yaml に追加します。
dependencies:
firebase_app_check: ^0.4.5
続いて、
flutter pub get
を実行します。
初期化
Firebase初期化後にApp Checkを有効化します。
await Firebase.initializeApp();
await FirebaseAppCheck.instance.activate(
androidProvider: AndroidProvider.playIntegrity,
appleProvider: AppleProvider.appAttest,
);
これだけでApp Checkが有効になります。
プラットフォームごとのプロバイダー
App CheckはOSごとに異なる認証方式を利用します。
Android
推奨は Play Integrity API です。
androidProvider:
AndroidProvider.playIntegrity
Google Play経由で配布された正規アプリかどうかなどを検証できます。
iOS
推奨は App Attest です。
appleProvider:
AppleProvider.appAttest
対応していない端末では、
AppleProvider.appAttestWithDeviceCheckFallback
を利用することでDeviceCheckへフォールバックできます。
Web
WebではreCAPTCHAを利用します。
await FirebaseAppCheck.instance.activate(
webProvider: ReCaptchaV3Provider(
'YOUR_SITE_KEY',
),
);
Botによるアクセスを防止できます。
Debug Provider
開発中はPlay IntegrityやApp Attestを利用できないケースがあります。
そのためDebug Providerが用意されています。
例(Android):
await FirebaseAppCheck.instance.activate(
androidProvider:
AndroidProvider.debug,
);
デバッグビルドでのみ利用し、本番では必ず正式なProviderへ切り替えましょう。
App Checkを有効にするとどうなる?
例えばCloud FirestoreでApp Checkを必須にすると、
App Checkあり
Flutterアプリ
↓
App Checkトークン
↓
Cloud Firestore
↓
アクセス成功
App Checkなし
curl
Postman
改造アプリ
↓
Cloud Firestore
↓
拒否
Firebase Console側でApp Checkを強制(Enforce)すると、トークンを持たないリクエストは拒否されます。
対応しているFirebaseサービス
App Checkは多くのFirebaseサービスと連携できます。
主な対応サービスは以下です。
- Cloud Firestore
- Realtime Database
- Cloud Storage
- Cloud Functions
- Authentication(一部機能)
- Vertex AI in Firebase
利用前に各サービスがApp Checkをサポートしているか確認しましょう。
導入時の注意点
Firebase Console側の設定も必要
Flutter側で初期化するだけでは有効になりません。
Firebase Consoleで、
- App Checkを有効化
- Providerを設定
- Enforcementを有効化
する必要があります。
いきなりEnforceしない
本番運用中のアプリでは、最初から強制モードにすると古いバージョンのアプリなどがアクセスできなくなる可能性があります。
まずは Monitor(監視)モード で問題がないことを確認し、その後Enforceへ切り替えるのがおすすめです。
App Checkだけでは認証にならない
App Checkは「正規アプリかどうか」を確認する仕組みです。
そのため、
- Firebase Authentication
- Firestore Security Rules
などと組み合わせて利用することが重要です。
メリット
Firebaseを不正利用されにくくなる
APIキーだけではアクセスできなくなるため、安全性が向上します。
FlutterFire公式
Firebase公式チームが提供・保守しています。
数行で導入できる
基本的な初期化は数行で完了します。
Firebase各サービスと連携
FirestoreやStorageなど複数のサービスで利用できます。
まとめ
firebase_app_checkは、FlutterアプリとFirebaseの間に「このアクセスは本当に正規アプリから来たものか」を確認する仕組みを追加できるFlutterFire公式パッケージです。
特に、
- Firestoreを公開している
- Cloud Functionsを利用している
- Cloud Storageへアップロードしている
- 多くのユーザーが利用するアプリ
では、導入する価値が非常に高い機能と言えるでしょう。
Firebase Authenticationは「ユーザー」を認証し、App Checkは「アプリ」を認証します。
この2つを組み合わせることで、より安全なFlutterアプリを構築できます。
