1. ホーム
  2. javascript

[解決済み] Firebaseのアクセス権が拒否されました

2022-05-18 09:39:28

質問

私は比較的新しいコーディング担当者ですが、困っています。

私は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 WARNING: set at /users/(GoogleID) failed: permission_denied です。 2016-05-23 22:52:42.707 firebase.js:227 Uncaught (in promise) Error: PERMISSION_DENIED: パーミッションが拒否されました(...)

私がこれを調べようとすると、Firebaseのルールについて話しますが、それは私がまだ学んでいない言語であるようです(またはそれは単に私の頭の上を通過しています)。何が原因なのか、どなたか説明していただけませんか?私は、私がメールとユーザー表示名を保存するように求めていて、あなたがこれを許可されていないだけだと思ったのですが、それらを取り除いても、まだ同じ問題がありました。ルールを設定せずにこのエラーを回避する方法があるのでしょうか、それともルールは1日で書けるようになるものなのでしょうか、それとも私の専門外なのでしょうか。

どんな助けでもありがとうございます!

どのように解決するのですか?

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


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

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

を参照してください。 quickstart for the Firebase Database security rules を参照してください。 .

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

データベースへの未認証のアクセスを許可する

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

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