41

サーバー側のコードを実行する必要があるため、主にメールを送信するため、データを保持するために Firebase とともにサーバー側の要素に Nodejs と Express を使用することにしました - 一部は学習経験からです。

私の質問は、Simple Email & Password API を使用して認証を行うときに、クライアント側の Firebase ライブラリと Nodejs ライブラリを使用することに関して、最善のアプローチは何ですか。クライアント側で認証を行い、その後 NodeJS 側で別のルートを呼び出すと、そのユーザーの認証がリクエストで実行されます。ユーザーがノード内で認証されていることをテストするアプローチは何でしょうか。

私が想定する1つのアプローチは、現在のユーザーのユーザー名とパスワードをfirebaseから取得し、これらをNodeJSに投稿してから、サーバーでfirebaseセキュリティAPIを使用してテストすることです。

4

2 に答える 2

57

ここでの本質的な問題は、クライアントが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サーバーにメールを送信させることができなくなります。これはおそらくあなたが望む動作です。また、サーバーが一時的にダウンしている場合、サーバーを再起動すると、電子メールの送信に「追いつき」、すべてが引き続き機能することを意味します。

于 2013-02-03T18:58:23.360 に答える