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.
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
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