Firebaseアクセス許可が拒否されました


123

私はコーディングに比較的慣れていないので問題があります。

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

ただし、エラーが発生し続けます。

FIREBASE警告:/ users /(GoogleID)に設定できませんでした:permission_denied 2016-05-23 22:52:42.707 firebase.js:227 Uncaught(in promise)エラー:PERMISSION_DENIED:Permission denied(…)

これを調べようとすると、Firebaseのルールについて話します。Firebaseのルールは、まだ学習していない(または頭の中で進んでいる)言語のようです。誰かが問題の原因を説明できますか?メールとユーザーの表示名を保存するように要求しているのではないかと思ったのですが、これを行うことはできませんでしたが、それらを取り出したときも同じ問題がありました。ルールを設定せずにこのエラーを回避する方法はありますか、またはルールは私が自分で一日に書く方法を自分で教えることができるものですか、それとも私は自分のリーグから抜け出しますか?

助けてくれてありがとう!

回答:


250

デフォルトでは、Firebaseコンソールのプロジェクトのデータベースは、管理ユーザー(Cloud Functions、またはAdmin SDKを使用するプロセスなど)のみが読み取り/書き込み可能です。通常のクライアント側SDKのユーザーは、サーバー側のセキュリティルールを変更しない限り、データベースにアクセスできません。


認証されたユーザーのみがデータベースを読み書きできるようにルールを変更できます。

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

Firebaseデータベースのセキュリティルールクイックスタートをご覧ください。

ただし、コードからユーザーをサインインしていないため、データベースはデータへのアクセスを拒否します。この問題を解決するには、データベースへの認証されていないアクセスを許可するか、データベースにアクセスする前にユーザーにサインインする必要があります。

認証されていないデータベースへのアクセスを許可する

現時点で最も簡単な回避策(チュートリアルが更新されるまで)は、プロジェクトのコンソールの[データベース]パネルに移動し、[ルール]タブを選択して、内容を次のルールに置き換えます。

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

これにより、データベースのURLを知っているすべてのユーザーが新しいデータベースを読み書きできるようになります。本番環境に移行する前に、データベースを再度保護してください。そうしないと、誰かが悪用し始める可能性があります。

データベースにアクセスする前にユーザーにサインインします

(少し)時間はかかりますが、より安全なソリューションの場合、Firebase AuthenticationsignIn...メソッドの1つを呼び出して、データベースにアクセスする前にユーザーがサインインしていることを確認します。これを行う最も簡単な方法は、匿名認証を使用することです。

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

そして、サインインが検出されたらリスナーを接続します

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
ありがとう-安全でない修正を使用し、同様の質問への回答に回答引用して、このEmberチュートリアルでの過去のFirebase権限の問題を進行させました。しかし、(安全な)匿名認証コードをどこに追加すればよいでしょうか?
Dave Everitt

2
OMGは1時間です。私はそこにこれを持っていましたが、値はFALSEでした...見落としました。それらをTRUEとbamに変更しました。アプリは思っ
Andy

OMG(私もfnも)は、両方が既にfalseに設定されているのに(私があなたのコメントを読むまで)なぜアクセス許可で失敗していたのか理解できませんでした。まあ、noobの間違いです。あなたがそれを一般に公開しているときは、どちらも真実である必要があります(読み取り)。あなた自身のエラーを指摘してくれてありがとう、あなたは私がそれを理解するのを助けました。記録のために、ルールを次のように変更しました: ".read":trueそしてそれが機能し始めました。
請負業者の

@Andyありがとう、私と同じで、あなたのコメントを見るだけで私の問題が解決しました;)
Mahmudul Hasan Sohag

86

私は同様の問題に直面しており、このエラーはリアルタイムデータベースの読み取り/書き込み操作に設定された不正なルールが原因であることがわかりました。デフォルトでは、Google Firebaseは現在、リアルタイムデータベースではなくクラウドストアをロードしています。リアルタイムに切り替えて正しいルールを適用する必要があります。

ここに画像の説明を入力してください

ご覧のとおり、Cloud Firestoreはリアルタイムデータベースではなく、正しいデータベースに切り替えると、以下のルールが適用されます。

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

3
UIくそー!私は丸一日過ごして、なぜ自分には異なるルールがあるのか​​を理解していました...ああ...それは「クラウドファイアストア」のためでした...ありがとう!
Alexey Volodko

43

言及した「データベース」オプションに移動します。

  1. 青いヘッダーにドロップダウンがあり、Cloud Firestore Betaと表示されています
  2. 「リアルタイムデータベース」に変更します
  3. ルールに移動し、.write .readをtrueに設定します

ここからコピー。


11

データベースに移動し、タイトルの横に2つのオプションがあります。

Cloud Firestore、Realtimeデータベース

Realtimeデータベースを選択し、ルールに移動します

ルールをtrueに変更します。

これは私の問題を解決しました。


4
  1. firebaseを開き、左側でデータベースを選択します。
  2. 次に、右側で、ドロップダウンから[Realtime database]を選択し、ルールを次のように変更します。{"rules":{".read":true、 ".write":true}}

できます..!!


5
これはすでに他の回答で述べられています。また、これを提案する場合は、これが保存されないため、必ず警告を追加してください。
アンドレ・クール

4

わかりましたが、リアルタイムデータベース全体を開く必要はありません。このようなものが必要です。

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

または

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

2

別の解決策は、すでに資格情報が手元にある場合は、実際にユーザーを自動的に作成またはログインすることです。ここに私がプレーン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);
        });
}

これはセキュリティの面で本当に悪いことです。
ASH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.