Flutter和Firestore在请求中没有用户信息

aqw*_*ert 8 dart firebase firebase-authentication flutter google-cloud-firestore

使用flutter,我已经安装了firebase-authfirestore包,并且能够使用firebase auth进行身份验证,并且只要我没有围绕用户的任何规则就可以调用firestore.

我有一个调用的按钮,_handleEmailSignIn我确实得到了一个有效的用户(因为他们在Firebase Auth DB中)

import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

final FirebaseAuth _auth = FirebaseAuth.instance;

void _handleEmailSignIn(String email, String password) async {
  try {
    FirebaseUser user = await _auth.signInWithEmailAndPassword(
        email: email, password: password);

    print("Email Signed in " + user.uid);  // THIS works
  } catch (err) {
    print("ERROR CAUGHT: " + err.toString());
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我有另一个按钮调用此函数来尝试将记录添加到testing123集合中.

Future<Null> _helloWorld() async {
  try {
    await Firestore.instance
        .collection('testing123')
        .document()
        .setData(<String, String>{'message': 'Hello world!'});
    print('_initRecord2 DONE');
  } catch (err) {
    print("ERROR CAUGHT: " + err.toString());
  }
}
Run Code Online (Sandbox Code Playgroud)

现在这个工作只要我没有任何关于检查请求用户的规则.这有效......

service cloud.firestore {
  match /databases/{database}/documents {
    match /testing123auth/{doc} {
        allow read, create
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

PERMISSION_DENIED: Missing or insufficient permissions.当我想确保我拥有经过身份验证的用户时,这并没有给出_handleEmailSignIn.

service cloud.firestore {
  match /databases/{database}/documents {
    match /testing123auth/{doc} {
        allow read, create: if request.auth != null;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑firestore请求不包括firebase用户.我是打算配置firestore来包含用户还是应该自动作为firebase的一部分?

bri*_*t08 -1

我建议制定这样的规则:

service cloud.firestore {
  match /databases/{database}/documents {
   match /testing123auth/{documents=**} {
    allow read, create: if true;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,限制用户的范围:

service cloud.firestore {
  match /databases/{database}/documents {
    match /testing123auth/{userId} {
      allow read, create: 
        if (request.auth.uid != null &&
            request.auth.uid == userId); // DOCUMENT ID == USERID
      } // END RULES FOR USERID DOC
      
      // IF YOU PLAN TO PUT SUBCOLLECTIONS INSIDE DOCUMENT:
      match /{documents=**} {
        // ALL DOCUMENTS/COLLECTIONS INSIDE THE DOCUMENT
        allow read, write:
          if (request.auth.uid != null &&
            request.auth.uid == userId);
      } // END DOCUMENTS=**
    } // END USERID DOCUMENT
  }
}
Run Code Online (Sandbox Code Playgroud)