Firebase 権限が拒否されました 質問する

Firebase 権限が拒否されました 質問する

私はコーディングの初心者なので、困っています。

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 キャッチされませんでした (promise 内) エラー: PERMISSION_DENIED: 権限が拒否されました(…)

調べてみると、Firebase のルールについて書かれていますが、まだ習得していない言語のようです (または、理解できないだけです)。 問題の原因を説明していただけますか? 電子メールとユーザーの表示名を保存するように要求したのに、それが許可されなかっただけだと思っていましたが、それらを削除しても同じ問題が発生しました。 ルールを設定せずにこのエラーを回避する方法はありますか? それとも、ルールは 1 日で自分で書く方法を学べるものですか? それとも、私にはまったく手に負えないのでしょうか?

ご協力いただきありがとうございます!

ベストアンサー1

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


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

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

を参照してくださいFirebase データベース セキュリティ ルールのクイックスタート

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

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

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

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

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

データベースにアクセスする前にユーザーをサインインしてください

(少し)時間はかかりますが、より安全な解決策としては、以下のいずれかsignIn...の方法を呼び出します。Firebase認証データベースにアクセスする前にユーザーがサインインしていることを確認する。これを行う最も簡単な方法は匿名認証を使用する:

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

おすすめ記事