コンテキスト: 私の iOS ゲームでは、ユーザーがログインせずにプレイできるようにしたい (Firebase で匿名で認証してユーザー データを保存する) だけでなく、Facebook でログインして追加のゲームプレイのロックを解除するオプションも提供したいと考えています。
この投稿を修正して、Twitter ログインを匿名ログインに置き換えようとしています。
"users": {
"$userid": {
// Require the user to be logged in, and make sure their current credentials
// match at least one of the credentials listed below, unless we're creating
// a new account from scratch.
".write": "auth != null &&
(data.val() === null ||
(auth.provider === 'facebook' && auth.uid === data.child('facebook/id').val() ||
(auth.provider === 'anonymous' && auth.uid === data.child('anonymous/id').val()))"
}
}
これらのルールで移行がどのように機能するか混乱しています。特に、次のように言います。
ユーザーは匿名で認証され、匿名の uid が に保存された正規ユーザー レコードを作成できます
users/"$userid"/anonymous/id
。これが許可されるのは、ユーザーが認証され、ユーザー オブジェクトが初めて設定されるためです (auth != null && data.val() === null
)。users/"$userid"/
認証されたユーザーの匿名 ID はユーザー ツリー ( ) に保存されるため、以降の への書き込みはすべて許可されますauth != null && (auth.provider === 'anonymous' && auth.uid === data.child('anonymous/id').val())
。ユーザーが facebook にログインします。
authData
にまだ書き込まれていない Facebook の uid が含まれるようになりましたusers/"$userid"/facebook/id
。セキュリティ ルールで許可されていないため、その場所への書き込みは失敗します。
そのため、Facebook の認証が完了するまで、匿名ユーザーは Facebook の uid にアクセスできません。users/"$userid"/facebook/id
その時点で、認証されたユーザーが facebook ユーザーになり、そこに書き込む権限がないため、書き込むには遅すぎます。
何か不足していますか?この状況を改善する方法についてのアイデアはありますか?