1

完全にオープン/許可すべてのルールを使用すると、クライアントコードから.addを呼び出してFirestoreルールを機能させることができます。Google Cloud Firestore:FirebaseError:[code = permission-denied]:アクセス権が不足しているか不足しています

これはVueJSアプリです。私のmain.js ...私は私のLogin.vueで

// You MUST import these 2 lines exactly so 
// to get firebase/firestore loaded and working 
import firebase from 'firebase'; 
import 'firebase/firestore'; 

import config from '../config/firebase.config.json'; 
firebase.initializeApp(config); 

Vue.config.productionTip = false; 
// Define some globals: Available to ALL page vues 
Vue.prototype.$http = require('axios'); 
Vue.prototype.$firebase = firebase; 

...

methods: { 
    loadFirebaseUIAuth() { 
     const firebaseUIConfig = { 
      'signInSuccessUrl': '/', 
      'signInOptions': [ 
       // Leave the lines as is for the providers you want to offer your users. 
       this.$firebase.auth.GoogleAuthProvider.PROVIDER_ID, 
       this.$firebase.auth.FacebookAuthProvider.PROVIDER_ID, 
       this.$firebase.auth.TwitterAuthProvider.PROVIDER_ID, 
       this.$firebase.auth.GithubAuthProvider.PROVIDER_ID 
       // firebase.auth.EmailAuthProvider.PROVIDER_ID 
      ], 
      // Terms of service url. 
      'tosUrl': '/tos' 
     }; 
     // Initialize the FirebaseUI Widget using Firebase. 
     const firebaseUI = new firebaseui.auth.AuthUI(this.$firebase.auth()); 
     // The start method will wait until the DOM is loaded. 
     firebaseUI.start('#firebaseui-auth-container', firebaseUIConfig); 
    }, 
    initFirebaseAuthHandler() { 
     this.$firebase.auth().onAuthStateChanged(function(user) { 
      if (user) { 
       // User is signed in. 
       userData.displayName = user.displayName; 
       userData.email = user.email; 
       userData.emailVerified = user.emailVerified; 
       userData.photoURL = user.photoURL; 
       userData.uid = user.uid; 
       userData.phoneNumber = user.phoneNumber; 
       userData.providerData = user.providerData; 
       user.getIdToken().then((accessToken) => { 
        console.log('Login.vue: FirebaseAuthHandler: sign-in-status:', 'Signed in!'); 
        userData.accessToken = accessToken; 
        // Store User info, mainly to pass accessToken in request headers 
        localStorage.clear('userData'); 
        localStorage.setItem('userData', JSON.stringify(userData)); 
       }); 
       console.log('Login.vue: userData: ', userData); 
      } else { 
       // User is signed out. 
       console.log('Login.vue: FirebaseAuthHandler: sign-in-status: ', 'Signed out'); 
      } 
     }, function(error) { 
      console.error('Login.vue: FirebaseAuthHandler: ', error); 
     }); 
    } 
} 

で私は、ユーザーのログインを接続するために何もして(私は見ることができないということ)はありませんよFirestore collection.add(...).then(...)に電話してください。 このconnect-user-info-to-firestoreの手順がありません。これは手動または自動のものですか?

私のクライアントBase.data-context.jsは

create(collection, model, doneSuccess, doneError) { 
    const doneCreate = (doc) => { 
     model.attribs = doc; 
     return doneSuccess(model); 
    }; 
    delete model.attribs.id; // Do not allow id when creating 
    model.attribs.createdby = 'WebUI'; 
    model.attribs.createdon = new Date(); 
    model.attribs.modifiedby = 'WebUI'; 
    model.attribs.modifiedon = new Date(); 
    model.attribs.modifiedlastip = ''; 
    collection.add(model.attribs).then(doneCreate).catch(doneError); 
} 

それは非常に一般的です...方法は次のようになります作成します。プレーヤーのコレクションで.addを呼び出します。私は私のFirestoreルールで

、...

service cloud.firestore { 
    match /databases/{database}/documents { 
     match /{document=**} { 
      // Any user can read or write this data 
      allow read: if true; 
      allow write: if true; 
     } 
     //match /{article=**} { 
     // // Only signed in users can write this data 
     // allow read: if true; 
     // allow write: if request.auth.uid != null; 
     //} 
     //match /{player=**} { 
     // // Only signed in users can read or write this data 
     // allow read: if request.auth.uid != null; 
     // allow write: if request.auth.uid != null; 
     //} 
     //match /{character=**} { 
     // // Only signed in users can read or write this data 
     // allow read: if request.auth.uid != null; 
     // allow write: if request.auth.uid != null; 
     //} 
    } 
} 

私は、することができますもはや最初の許可-すべてのブロックを排除していない、とだけrequest.auth.uid != nullを可能にしなければならない個々の文書を有効にするには、コメントを反転した場合書きます。投稿タイトルに権限エラーが表示されます。これは、コメントフリップでplayerコレクションへの書き込みを有効/無効にするため、ルールが処理されていることを示しています。

答えて

2

私は結局のところ答えを見つけました。上記のコードの99.9%は問題ありません。 this.$firebase.auth().onAuthStateChanged(function(user) {... authイベントハンドラ内に1行追加する必要があります。user.getIdToken().then((accessToken) => {の場合:firebaseにユーザaccessTokenの内容を伝える必要があります。this.$firebase.auth(accessToken);。その後、私のFirestoreのルールはすべて期待どおりに機能しました。

firebaseのリファレンスをVue.prototypeに保存してください。あなたのmain.jsに$ firebaseこれにより、すべてのコンポーネントでfirebaseにアクセスできます。

これは後で誰かに役立ちます:-)

+0

それは可能性があります!私はVueJSを知らないが、アンドロイドで、私は同じ問題があるようだ。私はあなたが意味することを理解していません。トークンを手動でファイアベースに渡さなければならないということですか? – liltof

+0

はい、正確です。あなたのコールバックで、accessTokenが返ってきたら、次のようにする必要があります: '$ firebase.auth(accessToken);'私のコードでは、コールバックでこれを行います: 'user.getIdToken()。then( (accessToken)=> {'これはあなたのコードで似ているかもしれません。 – Locohost

関連する問題