2013-02-03 12 views
39

Aufgrund der Notwendigkeit, etwas serverseitigen Code zu tun - vor allem das Senden von E-Mails habe ich beschlossen, Nodejs & Express für das Server-Element zusammen mit Firebase zu verwenden, um die Daten zu halten - teilweise von einer Lernerfahrung.Verwendung von NodeJs mit Firebase - Sicherheit

Meine Frage ist, was der beste Ansatz in Bezug auf die Verwendung der clientseitigen Firebase-Bibliothek und der Nodejs-Bibliothek bei der Authentifizierung mit der einfachen E-Mail-Kennwort-API ist. Wenn ich die Seite des Authentifizierungsclients mache und anschließend eine andere Route auf der NodeJS-Seite aufruft, wird die Authentifizierung für diesen Benutzer in der Anfrage durchgeführt. Was wäre der Ansatz, um den Benutzer zu testen, wird innerhalb von Node authentifiziert.

Ein Ansatz Ich nehme an, die aktuellen Benutzer Benutzername & Passwort von Firebase und dann diese auf NodeJS zu buchen und dann die Firebase Security API auf dem Server zu testen.

Antwort

56

Im Wesentlichen das Problem hier ist, müssen Sie sicher zu Ihrem NodeJS-Server übermitteln, der der Client als Firebase authentifiziert ist. Es gibt mehrere Möglichkeiten, wie Sie das erreichen könnten, aber am einfachsten ist es wahrscheinlich, wenn Ihre gesamte Client-< -> NodeJS-Kommunikation Firebase selbst durchläuft.

Anstatt den REST-Endpunkt von Ihrem NodeJS-Server bedienen zu lassen, muss der Client also an einen Firebase-Standort schreiben, den Ihr NodeJS-Server überwacht. Dann können Sie Firebase-Sicherheitsregeln verwenden, um die vom Client geschriebenen Daten zu überprüfen, und Ihr Server kann ihnen vertrauen.

Wenn Sie beispielsweise möchten, dass Benutzer beliebige E-Mails über Ihre App senden können (wobei Ihr NodeJS-Server sich um das Senden der E-Mails kümmert), könnten Sie einen/emails_to_send-Speicherort mit folgenden Regeln haben:

{ 
    "rules": { 
    "emails_to_send": { 
     "$id": { 
     ".write": "!data.exists() && newData.child('from').val() == auth.email", 
     ".validate": "newData.hasChildren(['from', 'to', 'subject', 'body'])" 
     } 
    } 
    } 
} 

dann im Client können Sie tun:

ref.child('emails_to_send').push({ 
    from: '[email protected]', 
    to: '[email protected]', 
    subject: 'hi', 
    body: 'Hey, how\'s it going?' 
}); 

und in Ihrem NodeJS Code, den Sie anrufen .auth könnten() mit Ihrem Firebase Geheimnis (so kann man alles lesen und schreiben) und dann tun:

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(); 
}); 

Dies wird sowohl die einfachste als auch die korrekteste Lösung sein. Wenn sich der Benutzer beispielsweise über Firebase abmeldet, kann er nicht mehr in Firebase schreiben, sodass er Ihren NodeJS-Server nicht mehr in die Lage versetzen kann, E-Mails zu senden. Dies ist wahrscheinlich das gewünschte Verhalten. Es bedeutet auch, wenn Ihr Server vorübergehend nicht erreichbar ist, wenn Sie ihn wieder starten, wird er die E-Mails "nachholen" und alles wird weiter funktionieren.

+2

Das ist ein toller Rat - danke. Vielleicht könnte die Firebase-Dokumentation um diese Architekturberatung erweitert werden. – markbarton

+3

Guter Punkt. Ich werde sehen, was wir tun können. :-) –

+0

Auf diese Weise sollte die Fehlerbehandlung beim E-Mail-Versand auch über Firebase erfolgen ... FYI – tomericco

0

Die oben genannten scheint wie ein Umweg, Dinge zu tun, würde ich etwas wie verwenden und Firebase als das Modell, alle Routen durch Express behandeln. Einfacher, wenn Ihr Express-Server Vorlagen rendert und sich nicht nur als JSON-API verhält.

Verwandte Themen