2015-01-23 12 views
5

Jestem w pewien sposób utrudniony w moich zasadach odczytu/zapisu w Firebase. Żałuję, że nie mam sposobu na ustalenie punktów przełomowych, ponieważ sprawdza on uwierzytelnianie (nie ma sposobu, prawda?).Umożliwianie dostępu do określonego użytkownika

Moje pytanie jest dość proste i mam wrażenie, że powinienem móc go lepiej zrozumieć. Czuję, że większość łodyg nie rozumie w pełni zasad. Ta informacja służy do prostego przeglądania produktów online, a właściciel musi mieć możliwość dodawania produktów. Dlatego chcę, aby świat był w stanie czytać, a ludzie, którzy się logują, mogli pisać.

Moje dane wygląda następująco:

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

i moich zasad:

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

i nie mam wielkie zrozumienie, co to oznacza. Naprawdę chcę tylko powiedzieć, że jeśli użytkownik jest zalogowany, zezwól na pisanie. Miałem nadzieję, że uda mi się coś takiego, na przykład ".write": "auth", co oznacza, że ​​jeśli auth istnieje (użytkownik jest zalogowany), pozwól mu pisać. Ale najwyraźniej nie do końca rozumiem, jak działają zasady. Używam prostego uwierzytelniania za pomocą poczty e-mail/hasła.

W jaki sposób są testowane te reguły i jak przekazywać do nich parametry?

Odpowiedz

13

postaram się wyjaśnić swoje bezpieczeństwo .write zasada, która brzmi:

"root.child('Users').child(auth.uid).child('email').val() === '[email protected]'" 

nie jest to rzeczywiście najprostszy przepis na początek i dokumentacja Firebase wprawdzie nurkuje na głębię dość szybko.

Po zalogowaniu się do mojego wniosku z Twittera, mój kod dostanie authData zmienną, która informuje go:

authData 
    uid: "twitter:4511241" 
    provider: "twitter" 
    id: "4511241" 

Nie może być jeszcze kilka właściwości, ale to powinno być istotą niego. Obiekt authData zazwyczaj zawiera obiekt podrzędny z właściwościami właściwymi dla dostawcy, więc w tym przypadku twitter i zwykle można znaleźć tam całkiem interesujące rzeczy. Tak jak w przypadku Twittera, nazwa twittera użytkownika.

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) 

Ten obiekt jest dostępny dla mojego kodu, domyślnie nie jest przechowywany w dowolnym miejscu w Firebase.

W swoich regułach bezpieczeństwa możesz sprawdzić w tej samej strukturze. Ale dostępny jest tylko minimalny podzbiór informacji, wystarczający do zidentyfikowania użytkownika. W Firebase documentation for the auth object Nazwy tych właściwości:

dostawcy | Zastosowana metoda uwierzytelniania ("hasło", "anonimowy", "facebook", "github", "google" lub "twitter").

uid | Niepowtarzalny identyfikator użytkownika, gwarantowany jako unikalny dla wszystkich dostawców.

Dzięki tym właściwościom możemy już zezwolić konkretnemu użytkownikowi na dostęp do naszych danych. Jak powiedziałem w moim komentarzu do swojej odpowiedzi:

".write": "auth.uid = 'twitter:4511241'" 

To pozwoli mi zapisywać dane kiedy zalogować się z moim kontem @puf Twitterze. Ale niestety nie pozwala mi sprawdzić właściwości bardziej przyjaznych dla użytkownika, takich jak adres e-mail.

Powszechną praktyką jest utworzenie najwyższego poziomu Users węzła w bazie Firebase i dodanie wszystkich informacji dla wszystkich użytkowników w tym węźle, identyfikowanych przez ich identyfikator UID. Więc w moim przypadku powyżej:

Users 
    twitter:4511241 
     userName: "puf" 
     displayName: "Frank van Puffelen" 
     email: "[email protected]" 
    github:913631 
     userName: "puf" 
     displayName: "Frank van Puffelen" 
     email: "[email protected]" 

Zostawiłem tutaj usługodawcy i id wyłączony, ponieważ nie zapewniają one wiele wartości dla przykładu

Kiedy wiesz użytkownika uid, można spojrzeć w górę jego dodatkowe informacje w tym węźle. I to jest dokładnie to, co zasady bezpieczeństwa trzeba było przed robi:

"root.child('Users').child(auth.uid).child('email').val() === '[email protected]'" 

Więc to będzie wyglądać z korzenia swojej Firebase, na węźle o nazwie Users, a następnie za uid od zalogowanego użytkownika i pod że jego/jej adres e-mail.

Najlepszą rzeczą przy sprawdzaniu konkretnego adresu e-mail jest to, że nie jest on powiązany z dostawcą użytkownika. Niezależnie od tego, czy użytkownik jest zalogowany na Twitterze, github, facebooku czy innym obsługiwanym usługodawcy, o ile korzystali z tego samego adresu e-mail dla każdego konta, będą mogli zapisać dane.

+0

To wyjaśnienie było niesamowite.Dziękuję za świetne dane wejściowe.Więc jeśli zmieniłoby mój "obiekt" użytkowników w bazie ogniowej do 'Użytkownicy -> id -> email: testuser @ test.com' my oryginalny warunek zadziałałby? – Aarmora

+0

Dopasowanie wiadomości e-mail wydaje się być świetnym pomysłem, ale czy istnieje tutaj zagrożenie bezpieczeństwa? Tj., w jaki sposób jest/jest w węźle db/w węźle Użytkownicy? Jeśli jest on zapełniany przez klienta za pomocą normalnych czasowników REST, a nie przez usługa firebase, co powstrzyma mnie przed przechwyceniem wkładki do mojego profilu tworzenie/Użytkownicy i umieszczanie w dowolnym adresie e-mail, który mi się podoba, np. [email protected]? Jeśli joefoo ma konto w twojej usłudze, wygląda na to, że teraz mam dostęp do jego rzeczy w bazie danych firebase. ** EDIT ** właśnie zobaczył komentarz @ PavelGeorgiev, który mówi zasadniczo to samo. – smacke

0

Wykonanie poniższych czynności najwyraźniej wystarczyło. Jeśli istnieje zmienna auth, zezwól na pisanie. Ze względu na mnie, nie do końca rozumiejąc te zasady, muszę się zastanawiać, czy to działa przeciwko bieżącego użytkownika lub jeśli to sprawdzić, jeśli każdy użytkownik jest zalogowany.

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

Witam Astronę, to naprawdę pozwoli każdemu dostępowi do odczytu i każdemu użytkownikowi, który jest zalogowany, do napisania węzła produktu. Prostym przykładem, który pozwala konkretnemu użytkownikowi na zapisanie, byłoby '" .write ":" auth.uid = "twitter: 4511241" '. Wartość ta to identyfikator uid, który mam w jednej z moich aplikacji, gdy uwierzytelniłem się przy użyciu Twittera. te uids nie są najłatwiejsze do zdobycia, bardziej popularne jest wyszukiwanie np. adresu e-mail użytkownika w regule '.write', co jest dokładnie tym, o czym mówi przykład w twoim pytaniu: –

+0

Napiszę odpowiedź, czy mogę wyjaśnić tę zasadę –