使用flutter,我已经安装了firebase-auth和firestore个软件包,并且能够使用firebase身份验证进行身份验证,并且只要我不这样做就可以打电话进入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());
}
}
然后我有另一个按钮调用此函数来尝试将记录添加到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());
}
}
现在只要我没有关于检查请求用户的任何规则,这就行了。这有效......
service cloud.firestore {
match /databases/{database}/documents {
match /testing123auth/{doc} {
allow read, create
}
}
}
当我想确保我使用PERMISSION_DENIED: Missing or insufficient permissions.
进行身份验证的用户时,这不会给_handleEmailSignIn
。
service cloud.firestore {
match /databases/{database}/documents {
match /testing123auth/{doc} {
allow read, create: if request.auth != null;
}
}
}
我怀疑firestore请求不包括firebase用户。我是打算将firestore配置为包含用户还是应该自动作为firebase的一部分?
答案 0 :(得分:2)
要注意的一件事是,文档firebase_core
是将所有服务连接在一起的“胶水”,当您使用Firebase身份验证和其他Firebase服务时,需要确保自己从相同的Firebase核心应用配置中获取实例。
final FirebaseAuth _auth = FirebaseAuth.instance;
如果您使用多个Firebase服务,则不应使用上述方式。
相反,您应该始终从FirebaseAuth
获取FirebaseAuth.fromApp(app)
,并使用相同的配置来获取所有其他Firebase服务。
FirebaseApp app = await FirebaseApp.configure(
name: 'MyProject',
options: FirebaseOptions(
googleAppID: Platform.isAndroid ? 'x:xxxxxxxxxxxx:android:xxxxxxxxx' : 'x:xxxxxxxxxxxxxx:ios:xxxxxxxxxxx',
gcmSenderID: 'xxxxxxxxxxxxx',
apiKey: 'xxxxxxxxxxxxxxxxxxxxxxx',
projectID: 'project-id',
bundleID: 'project-bundle',
),
);
FirebaseAuth _auth = FirebaseAuth.fromApp(app);
Firestore _firestore = Firestore(app: app);
FirebaseStorage _storage = FirebaseStorage(app: app, storageBucket: 'gs://myproject.appspot.com');
这可确保所有服务都使用相同的应用程序配置,并且Firestore将接收身份验证数据。
答案 1 :(得分:1)
firestore不需要为此进行任何特殊配置。
这就是您所需要的。 从Basic Security Rules修改:
service cloud.firestore {
match /databases/{database}/documents {
match /testing123/{document=**} {
allow read, write: if request.auth.uid != null;
}
}
}
似乎他们检查uid
是否是null
而不是auth
本身。试试看,看看是否可行。同样,您的代码似乎不一致,因为Firestore规则具有testing123auth
,而flutter具有testing123
。我不确定这是否是故意的。
答案 2 :(得分:0)
我本打算发表评论,但我的代表还不够。
您找到错误的解决方案了吗?我建议将规则设置为:
service cloud.firestore {
match /databases/{database}/documents {
match /testing123auth/{documents=**} {
allow read, create: if true;
}
}
}
或者更好的是,限制用户范围:
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
}
}
答案 3 :(得分:0)
要检查用户是否已登录,您应该使用
request.auth.uid != null