Domyślnie baza danych w projekcie w Konsoli Firebase jest odczytywana / zapisywana tylko przez użytkowników administracyjnych (np. W Cloud Functions lub w procesach korzystających z pakietu Admin SDK). Użytkownicy zwykłych zestawów SDK po stronie klienta nie mogą uzyskać dostępu do bazy danych, chyba że zmienisz reguły zabezpieczeń po stronie serwera.
Możesz zmienić reguły, aby baza danych była odczytywalna / zapisywalna tylko dla uwierzytelnionych użytkowników:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
Zobacz krótkie wprowadzenie do reguł bezpieczeństwa Bazy danych Firebase .
Ale ponieważ nie rejestrujesz użytkownika za pomocą kodu, baza danych odmawia Ci dostępu do danych. Aby rozwiązać ten problem, musisz zezwolić na nieuwierzytelniony dostęp do bazy danych lub zalogować użytkownika przed uzyskaniem dostępu do bazy danych.
Zezwól na nieuwierzytelniony dostęp do bazy danych
Najprostszym rozwiązaniem w tej chwili (do czasu aktualizacji samouczka) jest przejście do panelu Bazy danych w konsoli projektu, wybranie zakładki Reguły i zastąpienie treści następującymi regułami:
{
"rules": {
".read": true,
".write": true
}
}
To sprawia, że twoja nowa baza danych jest czytelna i zapisywalna dla każdego, kto zna adres URL bazy danych. Pamiętaj, aby ponownie zabezpieczyć swoją bazę danych przed rozpoczęciem produkcji, w przeciwnym razie ktoś prawdopodobnie zacznie jej nadużywać.
Zarejestruj użytkownika przed uzyskaniem dostępu do bazy danych
Aby uzyskać (nieco) bardziej czasochłonne, ale bezpieczniejsze rozwiązanie, wywołaj jedną z signIn...
metod uwierzytelniania Firebase, aby upewnić się, że użytkownik jest zalogowany przed uzyskaniem dostępu do bazy danych. Najprostszym sposobem na to jest użycie uwierzytelniania anonimowego :
firebase.auth().signInAnonymously().catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// ...
});
A następnie dołącz słuchaczy, gdy zostanie wykryte logowanie
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
var isAnonymous = user.isAnonymous;
var uid = user.uid;
var userRef = app.dataInfo.child(app.users);
var useridRef = userRef.child(app.userid);
useridRef.set({
locations: "",
theme: "",
colorScheme: "",
food: ""
});
} else {
// User is signed out.
// ...
}
// ...
});
Miałem podobny problem i odkryłem, że ten błąd był spowodowany nieprawidłowymi regułami ustawionymi dla operacji odczytu / zapisu dla bazy danych czasu rzeczywistego. Domyślnie Google Firebase obecnie ładuje sklep w chmurze, a nie bazę danych w czasie rzeczywistym. Musimy przejść do czasu rzeczywistego i zastosować odpowiednie zasady.
Jak widać, jest to napisane w chmurze Firestore, a nie w czasie rzeczywistym, po przełączeniu na poprawną bazę danych zastosuj poniższe zasady:
źródło
Przejdź do wspomnianej opcji „Baza danych”.
Skopiowano stąd .
źródło
Przejdź do bazy danych, obok tytułu znajdują się 2 opcje:
Cloud Firestore, baza danych czasu rzeczywistego
Wybierz Baza danych czasu rzeczywistego i przejdź do reguł
Zmień reguły na prawdziwe.
źródło
OK, ale nie chcesz otwierać całej bazy danych czasu rzeczywistego! Potrzebujesz czegoś takiego.
lub
źródło
źródło
Innym rozwiązaniem jest automatyczne utworzenie lub zalogowanie użytkownika, jeśli masz już pod ręką poświadczenia. Oto jak to robię za pomocą zwykłego JS.
źródło