2015-01-23 6 views
5

Sono piuttosto bloccato sulle regole di lettura/scrittura Firebase. Vorrei avere un modo per impostare i punti di interruzione mentre controlla l'autenticazione (non c'è un modo, c'è?).Permesso specifico per l'accesso in scrittura da parte degli utenti

La mia domanda è abbastanza semplice e sento che dovrei essere in grado di capirlo meglio. Mi sento come se la maggior parte degli steli non comprendesse pienamente le regole. Queste informazioni rappresentano un modo semplice per visualizzare i prodotti online e il proprietario deve essere in grado di aggiungere prodotti. Quindi voglio che il mondo sia in grado di leggere e le persone che accedono possano scrivere.

miei dati assomiglia:

app 
Users 
    email: [email protected] 
product 
    0 
    name: pizza 

E le mie regole:

{ 
    "rules": { 
     "product":{ 
     ".read": true, 
     ".write":"root.child('Users').child(auth.uid).child('email').val() === '[email protected]'" 
     } 
    } 
} 

e non ho una grande comprensione di ciò che questo significa. Voglio solo dire, se l'utente è loggato, consentire le capacità di scrittura. Speravo di poter avere qualcosa come ".write": "auth" che significa che se esiste un'autenticazione (l'utente ha effettuato l'accesso) lascia che lo scriva. Ma chiaramente non capisco appieno come funzionano le regole. Sto usando una semplice autenticazione email/password.

Come vengono testate queste regole e come posso passare loro i parametri?

risposta

13

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.

+0

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

+0

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

0

Fare il sotto sembrava fare il trucco. Se la variabile auth esiste, quindi consentire le abilità di scrittura. A causa di me non comprendere appieno queste regole, mi chiedo se questo è in esecuzione contro l'utente corrente o se è il controllo per vedere se un utente è connesso.

{ 
    "rules": { 
     "product":{ 
     ".read": true, 
     ".write":"auth !== null" 
     } 
    } 
} 
+0

Ciao Aarmora, questo consentirà infatti a tutti gli utenti di accedere e tutti gli utenti che hanno effettuato l'accesso per scrivere il nodo del prodotto. Un semplice esempio che consente a un utente specifico di scrivere sarebbe "" .write ":" auth.uid = "twitter: 4511241" ". Quel valore è l'uid che ho in una delle mie app quando ho effettuato l'autenticazione tramite twitter. quegli uid non sono i più facili da trovare, è più comune cercare, ad esempio, l'indirizzo email dell'utente nella regola '.write', che è esattamente ciò che fa l'esempio nella tua domanda. –

+0

Scriverò un risposta per vedere se riesco a spiegare questa regola –