简体   繁体   中英

VueJS + VueFire - Add data to Firebase Real Time Database with authentication

I'm using VueJS with VueFire and I need to save data to a Firebase Real Time Database with user authorization .

Error message:

util.js?54b5:189 FIREBASE WARNING: set at /notes/-L5J8Hk8wKHOxH-TQEhb failed: permission_denied exports.warn @ util.js?54b5:189 Repo.js?6ebd:510

Uncaught (in promise) Error: PERMISSION_DENIED: Permission denied

 at eval (Repo.js?6ebd:510) at Object.exports.exceptionGuard (util.js?54b5:556) at Repo.callOnCompleteCallback (Repo.js?6ebd:501) at eval (Repo.js?6ebd:278) at eval (PersistentConnection.js?eae0:411) at PersistentConnection.onDataMessage_ (PersistentConnection.js?eae0:444) at Connection.onDataMessage_ (Connection.js?33e2:262) at Connection.onPrimaryMessageReceived_ (Connection.js?33e2:256) at WebSocketConnection.eval [as onMessage] (Connection.js?33e2:157) at WebSocketConnection.appendFrame_ (WebSocketConnection.js?4701:197) 

My Firebase rule for authorization:

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

VueJS code addnote.vue :

<script>
 import Firebase from 'firebase'
  let config = {
    apiKey: '[...]',
    authDomain: '[...].firebaseapp.com',
    databaseURL: 'https://[...].firebaseio.com',
    projectId: '[...]',
    storageBucket: '',
    messagingSenderId: '[...]'
}
  let app = Firebase.initializeApp(config)
  let db = app.database()
  let notesRef = db.ref('notes')

export default {
    name: 'app',
    beforeCreate: function () {
      Firebase.auth().onAuthStateChanged((user) => {
        if (user) {
          this.user = user
          this.$bindAsArray('notes', db.ref(`notes/${user.uid}`))
        }
      })
    },
    firebase: {
      notes: notesRef
    },
    data () {
      return {
        user: null,
        newNote: {
          title: '',
          time: '',
          note: ''
        }
      }
    },
    methods: {
      addNote: function () {
        notesRef.push(this.newNote)
        this.newNote.title = ''
        this.newNote.time = ''
        this.newNote.note = ''
      },
      signInWithGoogle: function () {
        const provider = new Firebase.auth.GoogleAuthProvider()
        Firebase.auth().signInWithRedirect(provider).then((result) => {
          this.user = result.user
        }).catch(error => console.log(error))
      }
    }
}
</script>

You're listening to /notes and writing to ``/notes/-L5J8Hk8wKHOxH-TQEhb , while your rules only give you permission on /users/$uid`. Since you don't have permission on the latter, the write fails.

At a minimum you'll want to change:

beforeCreate: function () {
  Firebase.auth().onAuthStateChanged((user) => {
    if (user) {
      this.user = user
      this.$bindAsArray('notes', db.ref(`/users/${user.uid}`))
    }
  })
},

And:

addNote: function () {
    db.ref('users').child(this.user.uid).push(this.newNote)
    this.newNote.title = ''
    this.newNote.time = ''
    this.newNote.note = ''
},

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM