2013-02-03 10 views
39

サーバー側のコードを実行する必要があるため、主に電子メールを送信します.Navejs & Expressをサーバーサイド要素に使用し、Firebaseと共にデータを保持することに決めました。FirebaseでNodeJを使用する - セキュリティ

Simple Email &パスワードAPIを使用して認証を行う際に、クライアントサイドのFirebaseライブラリとNodejsライブラリを使用することに関して、私の質問にはどのような点がありますか。私が認証クライアント側を行い、その後NodeJS側で別のルートを呼び出すと、そのユーザの認証が要求内で実行されます。ユーザーをテストする方法は、ノード内で認証されます。

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

答えて

56

ここでの問題は、クライアントがFirebaseに対して認証されているNodeJSサーバに安全に伝える必要があることです。これについてはいくつかの方法がありますが、最も簡単なのはおそらくすべてのクライアントがFireFox自体を経由してNodeJS通信を行うことです。

クライアントが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: '[email protected]', 
    to: '[email protected]', 
    subject: 'hi', 
    body: 'Hey, how\'s it going?' 
}); 

そして、あなたのNodeJSコードで、あなたのFirebase秘密で)(.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サーバに電子メールを送信させることができなくなります。また、サーバーが一時的にダウンしている場合は、バックアップを開始すると、電子メールを送信して「追いつく」ことになり、すべてが引き続き機能します。

+2

すばらしいアドバイスありがとうございます。 firebaseのドキュメントをこのようなアーキテクチャのアドバイスを含むように拡張することもできます。 – markbarton

+3

良い点。私たちができることがわかります。 :-) –

+0

このようにして、電子メール送信時のエラー処理もFirebaseを通じて行う必要があります。FYI – tomericco

0

上記のことは、ラウンドアバウトのやり方のように思えますが、私はhttps://www.npmjs.com/package/connect-session-firebaseのようなものを使用し、firebaseをモデルとして使用し、expressを通してすべてのルートを処理します。エクスプレスサーバーがJSON APIとして動作するだけでなく、テンプレートをレンダリングする場合は簡単です。

関連する問題