Cercherò di spiegare il vostro .write
sicurezza regola, che è:
"root.child('Users').child(auth.uid).child('email').val() === '[email protected]'"
Questo non è davvero la regola più semplice per iniziare e la documentazione Firebase tuffa certamente prendere il largo piuttosto rapidamente.
Dopo accedo al mio applicazione con Twitter, il mio codice otterrà una variabile authData
che gli dice:
authData
uid: "twitter:4511241"
provider: "twitter"
id: "4511241"
Ci potrebbe essere un paio di proprietà, ma questo dovrebbe essere l'essenza di esso. AuthData in genere conterrà un oggetto figlio con proprietà specifiche del provider, quindi in questo caso twitter
e di solito è possibile trovare alcune cose interessanti. Come nel caso di Twitter, il nome twitter dell'utente.
authData
uid: "twitter:4511241"
provider: "twitter"
id: "4511241"
twitter:
userName: "puf"
email: "[email protected]" // note: this is just an example email address,
// it doesn't exist (as far as I know)
Questo oggetto è reso disponibile per il mio codice, non viene memorizzato in qualsiasi parte Firebase per impostazione predefinita.
Nelle regole di sicurezza è possibile verificare la stessa struttura. Ma solo un sottoinsieme minimo delle informazioni è disponibile qui, quanto basta per identificare l'utente. I nomi Firebase documentation for the auth object queste proprietà:
fornitore | Il metodo di autenticazione utilizzato ("password", "anonimo", "facebook", "github", "google" o "twitter").
uid | Un ID utente univoco, garantito per essere univoco tra tutti i provider.
Con queste proprietà, possiamo già consentire a un utente specifico accesso in scrittura ai nostri dati. Come ho detto nel mio commento alla risposta:
".write": "auth.uid = 'twitter:4511241'"
Questo mi permetterà di scrivere i dati quando accedo con il mio account Twitter @puf. Ma sfortunatamente non mi permette di verificare le proprietà più user-friendly, come l'indirizzo email.
Una pratica comune è quella di creare un nodo di livello superiore Users
nel Firebase e aggiungere tutte le informazioni per tutti gli utenti in tale nodo, identificati dal loro uid. Quindi, nel mio caso di cui sopra:
Users
twitter:4511241
userName: "puf"
displayName: "Frank van Puffelen"
email: "[email protected]"
github:913631
userName: "puf"
displayName: "Frank van Puffelen"
email: "[email protected]"
ho lasciato il provider e id fuori qui, dal momento che non offrono molto valore per l'esempio
Quando si sa di uid
un utente, è possibile guardare in alto le sue informazioni aggiuntive in questo nodo. E questo è esattamente ciò che le norme di sicurezza che aveva prima does:
"root.child('Users').child(auth.uid).child('email').val() === '[email protected]'"
Quindi questo guarderà dalla radice del vostro Firebase, per un nodo chiamato utenti, quindi per la uid
del utenti registrati e sotto che la sua/il suo indirizzo email
La cosa interessante del controllo di un indirizzo e-mail specifico è che non è legato al provider dell'utente. Quindi, indipendentemente dal fatto che l'utente sia connesso con twitter, github, facebook o qualche altro provider supportato, a condizione che utilizzino lo stesso indirizzo email per ciascun account, saranno in grado di scrivere i dati.
Questa spiegazione è stata sorprendente, grazie per l'ottimo input, quindi se dovessi cambiare il mio "oggetto" utente in firebase in "Utenti -> id -> email: testuser @ test.com' my la condizione originale funzionerebbe? – Aarmora
L'abbinamento email sembra un'idea interessante, ma c'è un rischio per la sicurezza qui? Cioè, come viene popolato il nodo/Users nel db? Se è popolato dal client tramite i normali verbi REST e non dal servizio Firebase, cosa mi impedisce di intercettare l'inserimento del mio profilo in formazione a/Utenti e inserendo qualsiasi indirizzo email mi piace, ad es. [email protected]? Se joefoo ha un account con il tuo servizio, sembra che ora posso accedere alla sua roba nel database di Firebase. ** EDIT ** ha appena visto il commento di PavelGeorgiev che dice essenzialmente la stessa cosa. – smacke