ここでの本質的な問題は、クライアントがFirebaseに対して認証されているNodeJSサーバーに安全に伝達する必要があることです。これにはいくつかの方法がありますが、おそらく最も簡単なのは、すべてのクライアント<->NodeJS通信をFirebase自体を経由させることです。
そのため、NodeJSサーバーがサービスを提供するRESTエンドポイントにクライアントをヒットさせる代わりに、NodeJSサーバーが監視しているFirebaseの場所にクライアントに書き込みを依頼します。次に、Firebaseセキュリティルールを使用して、クライアントによって書き込まれたデータを検証し、サーバーがそれを信頼できるようにします。
たとえば、ユーザーがアプリを介して任意のメールを送信できるようにする場合(NodeJSサーバーが実際にメールを送信するようにします)、次のようなルールで/emails_to_sendの場所を設定できます。
{
"rules": {
"emails_to_send": {
"$id": {
".write": "!data.exists() && newData.child('from').val() == auth.email",
".validate": "newData.hasChildren(['from', 'to', 'subject', 'body'])"
}
}
}
}
次に、クライアントで次のことができます。
ref.child('emails_to_send').push({
from: 'my_email@foo.com',
to: 'joe@example.com',
subject: 'hi',
body: 'Hey, how\'s it going?'
});
また、NodeJSコードで、Firebase Secretを使用して.auth()を呼び出し(すべてを読み書きできるようにするため)、次の操作を実行できます。
ref.child('emails_to_send').on('child_added', function(emailSnap) {
var email = emailSnap.val();
sendEmailHelper(email.from, email.to, email.subject, email.body);
// Remove it now that we've processed it.
emailSnap.ref().remove();
});
これは、最も簡単で最も正しい解決策になるでしょう。たとえば、ユーザーがFirebase経由でログアウトすると、Firebaseに書き込むことができなくなるため、NodeJSサーバーにメールを送信させることができなくなります。これはおそらくあなたが望む動作です。また、サーバーが一時的にダウンしている場合、サーバーを再起動すると、電子メールの送信に「追いつき」、すべてが引き続き機能することを意味します。