Izin Firebase Ditolak


123

Saya relatif baru dalam pengkodean dan saya mengalami masalah.

Saya memiliki kode ini untuk mengirim data ke firebase

app.userid = app.user.uid

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

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

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

Namun, saya terus mendapatkan kesalahan:

PERINGATAN FIREBASE: disetel ke / users / (GoogleID) gagal: izin_denied 2016-05-23 22: 52: 42.707 firebase.js: 227 Tidak tertangkap (dalam janji) Kesalahan: PERMISSION_DENIED: Izin ditolak (…)

Ketika saya mencoba untuk mencari ini, itu berbicara tentang aturan untuk Firebase, yang tampaknya dalam bahasa yang belum saya pelajari (atau itu hanya di atas kepala saya). Dapatkah seseorang menjelaskan apa yang menyebabkan masalah tersebut? Saya pikir itu karena saya memintanya untuk menyimpan email dan nama tampilan pengguna dan Anda hanya tidak diizinkan untuk melakukan ini, tetapi ketika saya mengeluarkannya, saya masih memiliki masalah yang sama. Adakah cara untuk menghindari kesalahan ini tanpa menetapkan aturan, atau apakah aturan adalah sesuatu yang dapat saya ajarkan sendiri bagaimana menulis dalam sehari, atau apakah saya baru saja keluar dari liga saya?

Terima kasih atas bantuannya!

Jawaban:


250

Secara default, database dalam proyek di Firebase Console hanya dapat dibaca / ditulis oleh pengguna administratif (misalnya di Cloud Functions, atau proses yang menggunakan Admin SDK). Pengguna SDK sisi klien reguler tidak dapat mengakses database, kecuali Anda mengubah aturan keamanan sisi server.


Anda dapat mengubah aturan sehingga database hanya dapat dibaca / ditulisi oleh pengguna yang diautentikasi:

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

Lihat panduan memulai untuk aturan keamanan Firebase Database .

Namun karena Anda tidak memasukkan pengguna dari kode Anda, database menolak akses Anda ke data. Untuk mengatasinya, Anda harus mengizinkan akses yang tidak diautentikasi ke database Anda, atau masuk ke pengguna sebelum mengakses database.

Izinkan akses tanpa autentikasi ke database Anda

Solusi paling sederhana untuk saat ini (hingga tutorial diperbarui) adalah masuk ke panel Database di konsol untuk proyek Anda, pilih tab Rules dan ganti konten dengan aturan berikut:

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

Ini membuat database baru Anda dapat dibaca dan ditulisi oleh siapa saja yang mengetahui URL database. Pastikan untuk mengamankan database Anda lagi sebelum Anda mulai berproduksi, jika tidak, seseorang akan mulai menyalahgunakannya.

Masuk pengguna sebelum mengakses database

Untuk solusi yang (sedikit) lebih memakan waktu, tetapi lebih aman, panggil salah satu signIn...metode Firebase Authentication untuk memastikan pengguna login sebelum mengakses database. Cara termudah untuk melakukannya adalah menggunakan otentikasi anonim :

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

Dan kemudian lampirkan pendengar Anda saat proses masuk terdeteksi

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
Terima kasih - menggunakan perbaikan yang tidak aman dan mengutip jawaban Anda dalam balasan untuk pertanyaan serupa untuk mengatasi masalah izin Firebase dalam tutorial Ember ini . Tetapi di mana kita menambahkan kode autentikasi anonim (aman)?
Dave Everitt

2
OMG, ini berlangsung satu jam. Saya memiliki ini di sana tetapi nilainya SALAH ... Saya hanya mengabaikannya. Mengubahnya menjadi TRUE dan bam, aplikasi berfungsi seperti yang Anda pikirkan ...
Andy

OMG, saya juga, tidak tahu mengapa mereka gagal pada izin ketika keduanya sudah disetel ke salah (sampai saya membaca komentar Anda). duh, noob error., keduanya harus benar saat kalian membuatnya terbuka untuk umum (baca). Terima kasih telah menunjukkan kesalahan Anda sendiri, Anda membantu saya mengetahuinya. Sebagai catatan, saya mengubah aturan saya menjadi ini: ".read": true dan kemudian mulai berfungsi.
contractorwolf

@Andy Terima kasih kawan, sama dengan saya dan melihat komentar Anda baru saja menyelesaikan masalah saya;)
Mahmudul Hasan Sohag

86

Saya menghadapi masalah serupa dan menemukan bahwa kesalahan ini disebabkan oleh aturan yang salah yang ditetapkan untuk operasi baca / tulis untuk database waktu nyata. Secara default, google firebase saat ini memuat penyimpanan awan, bukan basis data waktu nyata. Kita perlu beralih ke waktu nyata dan menerapkan aturan yang benar.

masukkan deskripsi gambar di sini

Seperti yang bisa kita lihat, Firestore mengatakan cloud bukan database waktu nyata, setelah beralih ke database yang benar, terapkan aturan di bawah ini:

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

3
UI sialan! Saya menghabiskan sepanjang hari, mencari tahu mengapa saya memiliki aturan yang berbeda ... Ah ... Itu untuk "cloud firestore" ... Terima kasih!
Alexey Volodko

43

Pergi ke opsi "Database" yang Anda sebutkan.

  1. Di sana di Blue Header Anda akan menemukan dropdown yang mengatakan Cloud Firestore Beta
  2. Ubah ke "Database realtime"
  3. Buka Rules dan setel .write .read keduanya menjadi true

Disalin dari sini .


11

Masuk ke database, di sebelah judul ada 2 pilihan:

Cloud Firestore, database Realtime

Pilih database Realtime dan buka aturan

ubah aturan menjadi benar.

Ini memecahkan masalah saya.


4
  1. Buka firebase, pilih database di sisi kiri.
  2. Sekarang di sisi kanan, pilih [Realtime database] dari drop-down dan ubah aturan menjadi: {"rules": {".read": true, ".write": true}}

berhasil..!!


5
Ini telah dikatakan di jawaban lain. Juga ketika Anda menyarankan ini, pastikan untuk menambahkan peringatan karena ini tidak disimpan!
André Kool

4

Oke, tapi Anda tidak ingin membuka seluruh database realtime! Anda membutuhkan sesuatu seperti ini.

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

atau

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

2

Solusi lain adalah benar-benar membuat atau masuk pengguna secara otomatis jika Anda sudah memiliki kredensial yang berguna. Berikut adalah cara saya melakukannya menggunakan Plain JS.

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

Ini benar-benar bijaksana keamanan yang buruk.
ASH
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.