firestore:PERMISSION_DENIED:権限がないか、不十分です


117

エラーが発生する

gettingdocuments.com.google.firebase.firestore.FirebaseFirestoreException:PERMISSION_DENIED:権限がないか不十分です。

elseステートメントの以下のコードの場合

db.collection("users")
    .get()
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
             if (task.isSuccessful()) {
                 for (DocumentSnapshot document : task.getResult()) {
                     s(document.getId() + " => " + document.getData());
                 }
             } else {
                 s("Error getting documents."+ task.getException());
             }
         }
     });

ユーザーはログインしていますか?
Suhayl SH

4
Firebaseコンソールの[セキュリティ]タブでルールを設定しましたか?
Suhayl SH

1
私の間違い、私はクラウドのファイヤーストアのドロップボックスを見ませんでした。リアルタイムデータベースのみをチェックインしていました。
S Rekhu 2017年

ありがとう@SuhaylSH
S Rekhu

回答:


169

それは単に私のために働きます。

データベースに移動->ルール->

allow read, write: if falseを変更します。true。

注:これにより、データベースのセキュリティが完全に無効になります。

認証なしで書き込み可能に!!! これは、実稼働環境に推奨するソリューションではありません。これはテスト目的でのみ使用してください。


42
それは誰もが許可なしにあなたのデータベースを読み書きできるようにすることに注意してください。
Sai Gopi Me

101
これは恐ろしいソリューションです。これは文字通りセキュリティを無効にするだけです。代わりにこれを読んでください:firebase.google.com/docs/firestore/security/get-started
Duncan Luk

2
@ojonugwaochalifuこれはすべての人に有効なので
Luvnish Monga

11
@DuncanLukが言ったように、それはひどい解決策です。私もそれを解決策とは言いません
Ojonugwa Jude Ochalifu

6
本当に早く始めるのに最適なソリューション。セキュリティ上の問題は後で実際に修正される可能性があります。
Viacheslav Dobromyslov

77

データベースに移動-> ルール

次に、ルールの下で変更

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

下へ

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

8
これは悪い考えです。これにより、すべてのドキュメントが認証されたユーザーによって書き込み可能になります。他のユーザーに属するもの、管理者のみが書き込み可能である、またはまったく書き込み可能でないものも含まれます。最初のコードは、実装されていないセキュリティルールを防ぐために残しておいてください。
Noxxys

1
他のユーザーに(Google SSOなどで)サインアップを許可すると、そのユーザーは自動的にすべてのデータにアクセスできるようになります。
ForrestLyman

2
認証されたユーザー(少数)がすべてのドキュメントにアクセスできるようにしたいので、このレシピは私の場合に最適です。
AFD、

1
これは受け入れられる答えになるはずです。
イシャーン

18

したがって、私の場合、次のDBルールがありました。

service cloud.firestore {
  match /databases/{database}/documents {
    match /stories/{story} {
      function isSignedIn() {
        return request.auth.uid != null;
      }
    
      allow read, write: if isSignedIn() && request.auth.uid == resource.data.uid
    }
  }
}

ご覧のとおりuidstoryドキュメントに所有者をマークます。

次に、私のコードですべてのストーリーを照会していました(Flutter):

Firestore.instance
          .collection('stories')
          .snapshots()

そして、別のユーザーを介してすでにいくつかのストーリーを追加しているため、失敗しました。これを修正するには、クエリに条件を追加する必要があります。

Firestore.instance
          .collection('stories')
          .where('uid', isEqualTo: user.uid)
          .snapshots()

詳細はこちら: https //firebase.google.com/docs/firestore/security/rules-query

編集:リンクから

ルールはフィルターではない ドキュメントを取得するためのクエリを作成する場合、セキュリティルールはフィルターではないことに注意してください。クエリはすべてかゼロかです。時間とリソースを節約するために、Cloud Firestoreは、すべてのドキュメントの実際のフィールド値ではなく、潜在的な結果セットに対してクエリを評価します。クエリがクライアントに読み取り権限がないドキュメントを返す可能性がある場合、リクエスト全体が失敗します。


ユーザーオブジェクトとは
Phani Rithvij

これが最善の答えです
Eliaのワイス

11

上記の投票した回答は、データベースの健全性にとって危険です。それでも、データベースを読み取り専用にして、書き込み専用ではないようにすることができます。

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}

1
権限を有効にする正しい方法は何ですか?
nyxee

7

Java Swingアプリケーションで試してみてください。

  1. GO TO Firebase Console> Project Overview>Project Settings

  2. 次に、[サービスアカウント]タブに移動し、[新しい秘密キーの生成]をクリックします。

  3. .jsonファイルを取得し、既知のパスに配置します

  4. 次に、[マイコンピュータのプロパティ]、[システムの詳細設定]、[環境変数]に移動します。

  5. GOOGLE_APPLICATION_CREDENTIALSjsonファイルへのパスで新しいパス変数値を作成します。


これも私の問題でした。ドキュメントにはこれに関する情報があります。
tris timb

4

npm i --save firebase @ angular / fire

app.moduleでインポートしたことを確認してください

import { AngularFireModule } from '@angular/fire';
import { AngularFirestoreModule } from '@angular/fire/firestore';

輸入品

AngularFireModule.initializeApp(environment.firebase),
    AngularFirestoreModule,
    AngularFireAuthModule,

リアルタイムのデータベースルールでは、

{
  /* Visit  rules. */
  "rules": {
    ".read": true,
    ".write": true
  }
}

クラウドのファイアストアルールでは、

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

3

DBが空ではなく、クエリが存在しないコレクションを対象としていることを確認してください


8
この例外は、空のコレクションまたはdbとは関係ありません。許可の問題です
Ojonugwa Jude Ochalifu '31

この例外は、空のDBなどとは関係ありません。セキュリティルールと認証の問題。
Rehan Ali

このシナリオでは、私と他の少なくとも3人にこの例外があります。それはあなたを助けるていない場合は、次の解決策に移動
itzhar

1

また、コードのコレクション参照がfirebaseのコレクション名と一致しない場合、このエラーが発生することがあります。

たとえば、firebaseのコレクション名はですがusers、それを参照するにはdb.collection("Users") orまたはdb.collection("user")

大文字と小文字も区別されます。

これが誰かを助けることを願っています


コレクションは暗黙的に作成されていませんか?あなたの例では、 "Users"および "user"コレクションは、参照されたときに作成されます。
bdev TJ


@DevTJはaddor setリクエストの場合は正しいですが、質問からはgetリクエストです。私はこれを以前に経験しました
アンガ


1

サービスアカウントを使用してFirestoreにアクセスしようとしているユーザーがいる場合:

この問題を解決Service Account UserするにはCloud Datastore User、GCPのIAM設定での役割に加えて、サービスアカウントに役割を付与します。


1

現時点では、2020年6月、デフォルトでファイアベースが時間で定義されています。ニーズを満たす時間を定義します。

allow read, write: if request.time < timestamp.date(2020, 7, 10);

0

問題は、ユーザーが認証される前に、リアルタイムデータベースまたはファイアストアに対してデータの読み取りまたは書き込みを行おうとしたことです。コードのスコープを確認してください。お役に立てば幸いです。



0

私にとっては日付の問題でした。それを更新し、問題は解決されました。

読み取り/書き込みを許可:

 if request.time < timestamp.date(2020, 5, 21);

編集:それでも混乱し、何が問題かわからない場合は、Firebaseコンソールのルールセクションを確認してください。


0

時間制限が過ぎている可能性があります

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // This rule allows anyone on the internet to view, edit, and delete
    // all data in your Firestore database. It is useful for getting
    // started, but it is configured to expire after 30 days because it
    // leaves your app open to attackers. At that time, all client
    // requests to your Firestore database will be denied.
    //
    // Make sure to write security rules for your app before that time, or else
    // your app will lose access to your Firestore database
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2020,7, 1);
    }
  }
}

この行には今日の日付変更されています:

 allow read, write: if request.time < timestamp.date(2020,7, 1);


-2

この場合、ルールはこのようにする必要がありますが、メッセージはそれが推奨される方法ではないことを示していますが、これを行うと、権限エラーなしで挿入を実行できます

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.