2016-10-04 12 views
7

Firebaseコンソールに2人のユーザが作成されていますが、どちらもユーザ名とメールアドレスが異なります。Swift + Firebaseセキュリティが動作しない

オンラインでスコアをデータベースに保存できるようにします。

let baseRef = FIRDatabase.database().reference(withPath: "GameStats/" + user.uid + "") 
let scoreRef = scoreRef.child("Score") 

scoreRef.observe(.value, with: { snapshot in 
    print(snapshot.value) 
}) 

私は2人のユーザが他のユーザからのその他の情報にアクセスできるかどうかをテストしたかった:それは私はこの使用しています同期

AppName 
    - GameStats 
    - DBW9WQEs2sQn9CuPTE9t7Q1qWSz2 
     - Score : 0986 
    - Li75C2BYW7bQnKqMmrqLAZ67HUy4 
     - Score : 44131 

この値にアクセスし、維持するために:これは構造体です。私はそうのような他のuser.uidを含めるように行を変更:

let baseRef = FIRDatabase.database().reference(withPath: "GameStats/Li75C2BYW7bQnKqMmrqLAZ67HUy4") 

// Logged in User: DBW9WQEs2sQn9CuPTE9t7Q1qWSz2 

、それはこれを出力し、いくつかの理由のために:

Optional(44131) 

私は、データベース内の値を変更した場合、それは自動的に値を更新します私が置いたもの。

これは間違ったユーザーで、なんらかの理由でアクセスできます。

これらは私のルールです:

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null", 
     "GameStats": { 
     "$user_id": { 
     ".write": "auth != null && auth.uid === $user_id && auth.provider === 'password'", 
     ".read": "auth != null && auth.uid === $user_id && auth.provider === 'password'" 
     } 
    } 
    } 
} 

はなぜアプリがあるユーザーが別のユーザーのデータを読み取るために、ユーザーが唯一の自分のユーザーIDの下でデータにアクセスできるように、どのように私はアクセスを制限しないことができていますか?

@M_Gが示唆しているように、私は.writeを親から、.readを取り出しました。だから私のルールは次のようになります。

{ 
    "rules": { 
    // ".read": "auth != null", 
    // ".write": "auth != null", 
     "GameStats": { 
     "$user_id": { 
     ".write": "auth != null && auth.uid === $user_id && auth.provider === 'password'", 
     ".read": "auth != null && auth.uid === $user_id && auth.provider === 'password'" 
     } 
    } 
    } 
} 

私は今、この出力を得る:

[FirebaseDatabase] setValue: or removeValue: at /GameStats/DBW9WQEs2sQn9CuPTE9t7Q1qWSz2 failed: permission_denied - This is for the correct user too. I get this error if wrong user also. 
+0

一般的な '.write'ルールを削除しようとしましたか? –

+0

@M_Gあなたは ".write": "auth!= null"を意味しますか?これらのルールは親を参照するだけですが。したがって、子ルールの指定 – JamesG

+0

GameStatsの書き込みルールが正しいと思われるので、試してみます。 –

答えて

3

Firebase文書は(今のところ)間違っています。 Firebaseコンソールで、ルールシミュレータを開きます。この時点では「パスワード」オプションはありません。私はバグだと思います。

複数の認証を使用していない場合、または複数の認証がプロジェクトに関係しない場合は、ルールに従ってプロバイダを使用しないでください。そうでなければ、パスワード認証のためにこのルールをテストできます:

".write": "auth != null && auth.uid === $user_id && auth.token.firebase.identities.email !== null" 
関連する問題