Firebase導入メモ

Firebase

Google が提供するクラウドベースの開発プラットフォーム

以下Firebase提供のサービスの一つであるFirebase Authenticationサービスを利用することで、AndroidやiOS向けなど各種アプリに、SMSやメール認証によるユーザ登録プロセスを導入することが出来ます。

料金体系については以下を参照願います。

  • フリーのSparkプラン

  • 従量課金制のBlazeプラン

SparkプランでのSMS送信数には以下制限はありますが、通信費は発生しません。

電話認証 - すべての地域:1 日あたり 10 件の SMS を送信


電話番号認証 スマートフォンに SMS メッセージを送信してユーザーを認証します。

iOS Android ウェブ C++ Unity

Android で電話番号を使用して Firebase 認証を行う  |  Firebase Authentication

Android Studioでの操作

debug.keystoreの作成

$ keytool -genkey -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android -keyalg RSA -keysize 2048 -validity 10000 -dname "CN=Android Debug,O=Android,C=US"

自己署名アプリ

キーストアのパスワードの入力を求めるプロンプトが表示されます。デバッグ キーストアのデフォルト パスワードは android です。Keytool はフィンガープリントをターミナルに出力します。

$ keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
Enter keystore password:  
Alias name: androiddebugkey
Creation date: Oct 31, 2023
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Android Debug, O=Android, C=US
Issuer: CN=Android Debug, O=Android, C=US
Serial number: xxxxxxxxxxxxxxxxxxxxx
Valid from: Tue Oct 31 17:21:41 JST 2023 until: Sat Mar 18 17:21:41 JST 2051
Certificate fingerprints:
	 SHA1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
	 SHA256: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3
......
......

Javaバージョンエラー

* What went wrong:
An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
   > Android Gradle plugin requires Java 17 to run. You are currently using Java 11.

上記エラーからJava 17のインストール

$ sudo apt install openjdk-17-jdk
$ sudo update-java-alternatives --list
$ java -version

Android で電話番号を使用して Firebase 認証を行う  |  Firebase Authentication

Firebase Authentication を使用して、ユーザーのスマートフォンに SMS メッセージを送信することで、ユーザーの登録認証を行うための参照コード。

登録ユーザーは SMS メッセージに記載された6桁のトークンを使用してアカウントをアクティベートします。

電話認証のActivityクラス

auth/app/src/main/java/com/google/firebase/quickstart/auth/kotlin/PhoneAuthActivity.kt

依存関係の確認

auth/app/build.gradle.kts

Bardへの質問

Android-Studioによるアプリの開発の場合、コーディングに関しての疑問は、Bardを利用することで生産性が大幅に向上します。ChatGPTでも同じことが言えますが、Google提供の各種APIサービスを導入する場合にはBardを活用した方が良いでしょう。

注) トークンとは、あるサービスに登録しているユーザやデバイスを区別するために利用される、暗号化された一時的なIDとして捉えましょう。

firebase対応のアプリがインストールされたデバイスのFCMトークンを取得するのにFirebaseMessagingServiceクラスまたはFirebaseMessagingクラスのどちらを使用するのが望ましいですか?

FirebaseMessagingServiceクラスとFirebaseMessagingクラスのどちらを使用するかは、アプリの要件に応じて異なります。

FirebaseMessagingServiceクラスは、Firebase Cloud Messaging サービスからの通知を受信するために使用されるクラスです。このクラスには、トークンを取得するためのメソッドがいくつか用意されています。

トークンを取得するためのメソッドは、次のとおりです。

  • onNewToken():デバイスのトークンが変更されたときに呼び出されるコールバック メソッドです。このメソッドは、新しいトークンを取得するために使用できます。
  • getToken():デバイスに割り当てられているデフォルトの FCM トークンを取得します。このトークンは、アプリがバックグラウンドで実行されている場合でも、アプリのライフサイクル全体を通じて有効です。

FirebaseMessagingクラスは、Firebase Cloud Messaging サービスを操作するために使用されるクラスです。このクラスには、トークンを取得するためのメソッドも用意されています。

トークンを取得するためのメソッドは、次のとおりです。

  • getToken():デバイスに割り当てられているデフォルトの FCM トークンを取得します。このトークンは、アプリがバックグラウンドで実行されている場合でも、アプリのライフサイクル全体を通じて有効です。

FirebaseMessagingServiceクラスを使用する場合のメリット

  • Firebase Cloud Messaging サービスからの通知を受信するために使用できるため、アプリの通知機能を実装する場合に便利です。
  • onNewToken() メソッドを使用することで、常に最新のトークンを取得できます。

FirebaseMessagingクラスを使用する場合のメリット

  • FirebaseMessagingServiceクラスよりもシンプルなコードで記述できます。
  • getToken() メソッドを使用することで、アプリのライフサイクル全体を通じて有効なトークンを取得できます。

結論

FirebaseMessagingServiceクラスを使用する場合は、Firebase Cloud Messaging サービスからの通知機能を実装する必要がある場合に便利です。FirebaseMessagingクラスを使用する場合は、Firebase Cloud Messaging サービスからの通知機能を実装する必要がない場合に便利です。

具体的には、次の場合にFirebaseMessagingServiceクラスを使用するのが望ましいと言えます。

  • アプリでFirebase Cloud Messaging サービスからの通知機能を実装する必要がある場合
  • 常に最新のトークンを取得する必要がある場合

具体的には、次の場合にFirebaseMessagingクラスを使用するのが望ましいと言えます。

  • アプリでFirebase Cloud Messaging サービスからの通知機能を実装する必要がない場合
  • アプリのライフサイクル全体を通じて有効なトークンを取得する必要がある場合

Firebaseのトークンとは?

Firebase のトークンは、Firebase サービスとの通信に使用される、一意の識別子です。Firebase のトークンは、大きく分けて以下の 2 種類があります。

  • ID トークン

ID トークンは、ユーザーまたはデバイスを識別するために使用されます。ユーザーがログインすると、Firebase はユーザーに ID トークンを生成します。ID トークンは、Firebase Realtime Database、Cloud Storage、Cloud Functions などのサービスへのアクセスに使用できます。

  • デバイス登録トークン

デバイス登録トークンは、デバイスを識別するために使用されます。アプリが起動すると、Firebase はデバイスにデバイス登録トークンを生成します。デバイス登録トークンは、Firebase Cloud Messaging (FCM) を使用して、アプリに通知を送信するために使用できます。

Firebase のトークンは、JSON Web Token (JWT) 形式で作成されます。JWT は、署名付きの JSON オブジェクトです。署名は、トークンの改ざんを検出するために使用されます。

Firebase のトークンの有効期限は、トークンの種類によって異なります。ID トークンの有効期限は 1 時間です。デバイス登録トークンの有効期限は 2 か月です。

Firebase のトークンは、アプリのセキュリティを強化するために使用されます。トークンを使用すると、Firebase サービスは、ユーザーまたはデバイスが正当なユーザーであることを確認できます。

具体的なトークンの例を表示できますか?

はい、Firebase のトークンの例を表示します。

ID トークンの例

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbkBnbWFpbC5jb20iLCJyb2xlIjoid2ViYXV0aG9yaXphdGlvbiIsImF1dGhvcl9pZCI6IjEiLCJleHAiOjE2MzY0NjM0MTMsImlzcyI6Imh0dHBzOi8vZXhhbXBsZS5jb20iLCJzdWIiOiIifQ.t12345678901234567890

このトークンは、以下の構成になっています。

  • ヘッダー

    • typ: トークンのタイプ(JWT)
    • alg: 署名アルゴリズム(RS256)
  • ペイロード

    • uid: ユーザー ID
    • email: ユーザーのメールアドレス
    • exp: トークンの有効期限
  • 署名

    • ヘッダーとペイロードのハッシュ値

デバイス登録トークンの例

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJ0ZXN0QGV4YW1wbGUuY29tIiwicm9sZSI6InRlc3RAZXhhbXBsZS5jb20iLCJhZG1pbiI6dHJ1ZSwiZXhwIjoxNjM2NDYyNDAzLCJpc3MiOiJodHRwczovL2V4YW1wbGUuY29tIiwiZXhwIjoxNjM2NDYyNDAzLCJzY29wZXMiOlsiYWNjZXNzIiwiZGF0YSIsImp0aSI6Ijc4Y2FmMjcyLTQ1YTMtNDY0MS1iYjU2LTYzY2U2MTk1ZmE0MCJ9.p98765432109876543210

このトークンは、以下の構成になっています。

  • ヘッダー

    • typ: トークンのタイプ(JWT)
    • alg: 署名アルゴリズム(RS256)
  • ペイロード

    • token: デバイス登録トークン
    • platform: デバイスのプラットフォーム(Android / iOS)
    • deviceId: デバイスの ID
    • exp: トークンの有効期限
  • 署名

    • ヘッダーとペイロードのハッシュ値

Firebase のトークンは、Firebase サービスとの通信に使用される重要なツールです。トークンの構成を理解しておくことで、Firebase サービスとの通信を安全に行うことができます。

各種キーの役割

ウェブAPIキーは、アプリがFirebaseのAPIにアクセスする際に利用されるキー。
アプリには google-service.json で読み込まれます。

サーバキーはサーバトークンとしてサーバ側で指定する必要があります。
Flexisipサーバflexisip.conf とアカウントマネージャの .env ファイルで指定します。

FCMメッセージのテスト送信

メッセージタイトル、送信メッセージを入力し テストメッセージを送信 ボタンをクリック

FCM登録トークン(デバイストークン)を追加

Android-Studioの仮想デバイスのデバイストークンをログから取得し追加。
テストボタンをクリックするとデバイスにメッセージが表示されます。

FCM 登録トークン管理のベスト プラクティス  |  Firebase Cloud Messaging

Conditions for using Firebase SMS OTP

アンドロイドアプリ、ウェブアプリでFirebaseのメッセージ送信機能を利用する場合の条件は以下の通りです。ウェブアプリ上で電話番号により新規にユーザ登録する場合には、電話番号が登録されているデバイストークンが取得できないため、SMS(OTP)機能は使用できません(既にFirebaseでユーザ登録されている場合は除く)。

The conditions for utilizing Firebase’s messaging functionality in Android and web applications are as follows:

In the case of registering a new user on a web application with their phone number, SMS (OTP) functionality cannot be used if the device token associated with the phone number cannot be obtained (excluding cases where the user is already registered with Firebase).

Registration from Android App Registration from Web App Login from Android App Login from Web App
Firebase FCM O *X O O
Firebase SMS(OTP) O *X O O

*X) If an user device has been already registered as Firebase user, it will be OK.
Android App : Linphone
Web App : Flexisip (Account Manager API)

Android アプリでメッセージを受信する  |  Firebase Cloud Messaging

デフォルトではアプリがバックグラウンドで動作している場合に限りシステムトレイにメッセージが表示されます。

アプリの状態 通知 データ 両方
フォアグラウンド onMessageReceived onMessageReceived onMessageReceived
バックグラウンド システムトレイ onMessageReceived 通知: システムトレイ、データ: インテントの追加部分内

FCM メッセージについて  |  Firebase Cloud Messaging

>>>>>> 使用シナリオ 送信方法
通知メッセージ クライアント アプリがバックグラウンドで実行されている場合、FCM SDK は、クライアント アプリに代わってエンドユーザーのデバイスにメッセージを表示します。通知を受信しているときにアプリがフォアグラウンドで実行されている場合、アプリのコードによってアプリの動作が決定されます。通知メッセージでは、いくつかのユーザー表示用キーが事前定義されており、カスタムの Key-Value ペアのデータ ペイロードを任意に指定できます。 1. Cloud Functions やアプリサーバーなどの信頼できる環境で、Admin SDK または FCM サーバー プロトコルを使用し、notification キーを設定します。オプションのデータ ペイロードを指定できます。常に折りたたみ可能になります。表示通知の例を参照して、リクエストのペイロードを送信します。 2. Notifications Composer を使用し、メッセージのテキストやタイトルなどを入力して送信します。カスタムデータを指定することで、オプションのデータ ペイロードを追加できます。
データ メッセージ クライアント アプリがデータ メッセージの処理を行います。データ メッセージには、予約済みのキー名のないカスタム Key-Value ペアのみが含まれます(以下を参照)。 Cloud Functions やアプリサーバーなどの信頼できる環境で、Admin SDK または FCM サーバー プロトコルを使用し、data キーのみを設定します。

REST Resource: projects.messages  |  Firebase Cloud Messaging REST API

AndroidConfig

{
  "collapse_key": string,
  "priority": enum (AndroidMessagePriority),
  "ttl": string,
  "restricted_package_name": string,
  "data": {
    string: string,
    ...
  },
  "notification": {
    object (AndroidNotification)
  },
  "fcm_options": {
    object (AndroidFcmOptions)
  },
  "direct_boot_ok": boolean
}

通知を作成する  |  Android デベロッパー  |  Android Developers

通知チャネルを作成して管理する  |  Android デベロッパー  |  Android Developers

https://developer.android.com/reference/kotlin/androidx/core/app/NotificationCompat.Builder