Firebase İzni Reddedildi


124

Kodlamada nispeten yeniyim ve sorun yaşıyorum.

Verileri firebase'e göndermek için bu koda sahibim

app.userid = app.user.uid

var userRef = app.dataInfo.child(app.users);

var useridRef = userRef.child(app.userid);

useridRef.set({
  locations: "",
  theme: "",
  colorScheme: "",
  food: ""
});

Ancak, şu hatayı almaya devam ediyorum:

FIREBASE UYARISI: / users / (GoogleID) olarak ayarlanamadı: permi_denied 2016-05-23 22: 52: 42.707 firebase.js: 227 Yakalanmamış (sözde) Hata: PERMISSION_DENIED: İzin reddedildi (…)

Buna bakmaya çalıştığımda, henüz öğrenmediğim bir dilde görünen Firebase kurallarından bahsediyor (ya da sadece kafamın üzerinden geçiyor). Birisi soruna neyin sebep olduğunu açıklayabilir mi? E-postayı ve kullanıcı adını saklamasını istediğimi düşündüm ve bunu yapmanıza izin verilmedi, ancak bunları çıkardığımda hala aynı sorunu yaşadım. Kuralları belirlemeden bu hatayı önlemenin bir yolu var mı, yoksa kurallar bir günde yazmayı kendime öğretebileceğim bir şey mi yoksa kendi ligimin dışında mıyım?

Herhangi bir yardım için teşekkürler!

Yanıtlar:


250

Varsayılan olarak, Firebase Konsolundaki bir projedeki veritabanı yalnızca yönetici kullanıcılar tarafından okunabilir / yazılabilir (ör. Cloud Functions veya Yönetici SDK kullanan işlemler). Normal istemci tarafı SDK'ların kullanıcıları, sunucu tarafı güvenlik kurallarını değiştirmediğiniz sürece veritabanına erişemez.


Kuralları, veritabanı yalnızca kimliği doğrulanmış kullanıcılar tarafından okunabilir / yazılabilir olacak şekilde değiştirebilirsiniz:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

Firebase Veritabanı güvenlik kuralları için hızlı başlangıca bakın .

Ancak kullanıcıyı kodunuzdan oturum açmadığınız için, veritabanı verilere erişiminizi reddeder. Bunu çözmek için veritabanınıza kimliği doğrulanmamış erişime izin vermeniz veya veritabanına erişmeden önce kullanıcıda oturum açmanız gerekir.

Veritabanınıza kimliği doğrulanmamış erişime izin verin

Şu an için en basit geçici çözüm (eğitim güncellenene kadar), projeniz için konsolda Veritabanı paneline gitmek, Kurallar sekmesini seçmek ve içeriği şu kurallarla değiştirmektir:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

Bu, yeni veritabanınızı veritabanının URL'sini bilen herkes tarafından okunabilir ve yazılabilir hale getirir. Üretime geçmeden önce veritabanınızı yeniden güvence altına aldığınızdan emin olun, aksi takdirde birisi onu kötüye kullanmaya başlayabilir.

Veritabanına erişmeden önce kullanıcıda oturum açın

(Biraz) daha fazla zaman alan, ancak daha güvenli bir çözüm için, kullanıcının veritabanına erişmeden önce oturum açtığından emin olmak için Firebase Kimlik DoğrulamasısignIn... yöntemlerinden birini çağırın . Bunu yapmanın en basit yolu anonim kimlik doğrulaması kullanmaktır :

firebase.auth().signInAnonymously().catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  // ...
});

Ve sonra, oturum açma algılandığında dinleyicilerinizi ekleyin

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.
    // ...
  }
  // ...
});

1
Teşekkürler - güvenli olmayan düzeltmeyi kullandık ve bu Ember eğiticisindeki Firebase izin sorunlarını aşmak için benzer bir soruya yanıtınızı aktardınız . Ancak (güvenli) anonim kimlik doğrulama kodunu nereye ekleyeceğiz?
Dave Everitt

2
OMG oraya bir saat gider. Bunu orada buldum ama değerler YANLIŞ ... Sadece gözden kaçırdım. TRUE ve bam olarak değiştirildi, uygulama düşündüğünüz gibi çalışıyor ...
Andy

OMG, ben de, ikisi de zaten yanlış olarak ayarlanmışken (ben yorumunuzu okuyana kadar) izinlerde neden başarısız olduklarını anlayamadım. duh, çaylak hatası. bunu halka açtığınızda her ikisi de doğru olmalıdır (okur). Kendi hatasını gösterdiğin için teşekkürler, çözmeme yardım ettin. Kayıt için kuralımı şu şekilde değiştirdim: ".read": true ve sonra çalışmaya başladı.
contractorwolf

@Andy Teşekkürler dostum, aynı benim için ve yorumunuzu görmek benim sorunumu çözdü;)
sorunumu

86

Benzer bir sorunla karşı karşıyaydım ve bu hatanın gerçek zamanlı veritabanı için okuma / yazma işlemleri için belirlenen yanlış kurallardan kaynaklandığını öğrendim. Varsayılan olarak, google firebase bugünlerde bulut deposunu gerçek zamanlı olmayan veritabanını yükler. Gerçek zamana geçmeli ve doğru kuralları uygulamalıyız.

görüntü açıklamasını buraya girin

Gördüğümüz gibi bulut Firestore'un gerçek zamanlı veritabanı olmadığını söylüyor, doğru veritabanına geçtikten sonra aşağıdaki kuralları uygulayın:

{
   "rules": {
       ".read": true,
       ".write": true
     }
 }

3
Lanet kullanıcı arayüzü! Tüm günü neden farklı kurallarım olduğunu anlayarak geçirdim ... Ah ... "Bulut yangın deposu" içindi ... Teşekkürler!
Alexey Volodko

43

Bahsettiğiniz "Veritabanı" seçeneğine gidin.

  1. Blue Header'da, Cloud Firestore Beta yazan bir açılır menü bulacaksınız.
  2. "Gerçek zamanlı veritabanı" olarak değiştirin
  3. Kurallara gidin ve .write .read ikisini de true olarak ayarlayın

Buradan kopyalandı .


11

Veritabanına git, başlığın yanında 2 seçenek var:

Cloud Firestore, Gerçek Zamanlı veritabanı

Gerçek zamanlı veritabanını seçin ve kurallara gidin

kuralları doğru olarak değiştirin.

Bu benim sorunumu çözdü.


4
  1. Firebase'i açın, sol taraftan veritabanını seçin.
  2. Şimdi sağ tarafta, açılır menüden [Gerçek zamanlı veritabanı] 'nı seçin ve kuralları şu şekilde değiştirin: {"kurallar": {".read": true, ".write": true}}

işe yarıyor..!!


5
Bu zaten diğer cevapta söylendi. Ayrıca bunu önerdiğinizde, bir uyarı eklediğinizden emin olun çünkü bu kaydedilmez!
André Kool

4

Tamam, ancak gerçek zamanlı veritabanının tamamını açmak istemiyorsunuz! Bunun gibi bir şeye ihtiyacın var.

{
  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
  "rules": {
    ".read": "auth.uid !=null",
    ".write": "auth.uid !=null"
  }
}

veya

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

1

Başka bir çözüm, kimlik bilgilerine zaten sahipseniz, kullanıcıyı otomatik olarak oluşturmak veya oturum açmaktır. İşte bunu Plain JS kullanarak nasıl yapıyorum.

function loginToFirebase(callback)
{
    let email = 'xx@xx.com';
    let password = 'xxxxxxxxxxxxxx';
    let config =
    {
        apiKey: "xxx",
        authDomain: "xxxxx.firebaseapp.com",
        projectId: "xxx-xxx",
        databaseURL: "https://xxx-xxx.firebaseio.com",
        storageBucket: "gs://xx-xx.appspot.com",
    };

    if (!firebase.apps.length)
    {
        firebase.initializeApp(config);
    }

    let database = firebase.database();
    let storage = firebase.storage();

    loginFirebaseUser(email, password, callback);
}

function loginFirebaseUser(email, password, callback)
{
    console.log('Logging in Firebase User');

    firebase.auth().signInWithEmailAndPassword(email, password)
        .then(function ()
        {
            if (callback)
            {
                callback();
            }
        })
        .catch(function(login_error)
        {
            let loginErrorCode = login_error.code;
            let loginErrorMessage = login_error.message;

            console.log(loginErrorCode);
            console.log(loginErrorMessage);

            if (loginErrorCode === 'auth/user-not-found')
            {
                createFirebaseUser(email, password, callback)
            }
        });
}

function createFirebaseUser(email, password, callback)
{
    console.log('Creating Firebase User');

    firebase.auth().createUserWithEmailAndPassword(email, password)
        .then(function ()
        {
            if (callback)
            {
                callback();
            }
        })
        .catch(function(create_error)
        {
            let createErrorCode = create_error.code;
            let createErrorMessage = create_error.message;

            console.log(createErrorCode);
            console.log(createErrorMessage);
        });
}

Bu, güvenlik açısından gerçekten kötü.
ASH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.