-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Closed
Description
[REQUIRED] Environment info
firebase-tools: 6.10.0
Platform: macOS
[REQUIRED] Test case
This will take a moment, brb
[REQUIRED] Steps to reproduce
- Setup a Java project with the Firestore gcloud SDK, or the Firebase Admin SDK. Either way, make sure you're on the newest Firestore release. In Gradle, for us, that's:
compile group: 'com.google.cloud', name: 'google-cloud-firestore', version: '1.6.0'
- Install the latest gcloud SDK locally. Gcloud reports the following for
gcloud --version:
Google Cloud SDK 248.0.0
alpha 2019.05.17
app-engine-go
app-engine-java 1.9.74
app-engine-python 1.9.85
beta 2019.05.17
bq 2.0.43
cloud-build-local
cloud-datastore-emulator 2.1.0
cloud-firestore-emulator 1.4.6
cloud_sql_proxy
core 2019.05.24
docker-credential-gcr
emulator-reverse-proxy
gsutil 4.38
pubsub-emulator 2019.04.26
- Write up a rules file for local emulator access to Firestore. Try your hardest to make it fully open - i.e. allow all traffic for basic testing.
rules_version = '2';
service cloud.firestore {
match /databases/{database} {
allow read, write: if true;
match /{document=**} {
allow read, write: if true;
}
}
}
- Try to run
listDocuments()on a query, receive the following exception:
com.google.cloud.firestore.FirestoreException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Metadata operations require admin authentication.
at com.google.cloud.firestore.FirestoreException.apiException(FirestoreException.java:79)
at com.google.cloud.firestore.CollectionReference.listDocuments(CollectionReference.java:140)
[... lots of user code...]
- Think to yourself, okay, I'll play this dumb credentials game. So you load up your JSON service account key file, and inject the credentials into the Firestore adapter, like you do for production access to Firestore:
public static @Provides FirestoreOptions getFirestoreOptions() {
// [... lots of prep ...]
if (emulator) {
final CredentialsProvider adminCreds = FixedCredentialsProvider.create(googleCreds);
opts.setCredentials(googleCreds);
opts.setCredentialsProvider(credentialsProvider);
return opts.build();
}
return opts.build();
}- Run it again. Observe the following exception, because the emulator isn't running via TLS, we see that the request is rejected again, this time because you cannot use credentials over a plaintext connection:
Caused by: com.google.api.gax.rpc.UnauthenticatedException: io.grpc.StatusRuntimeException: UNAUTHENTICATED: Credentials require channel with PRIVACY_AND_INTEGRITY security level. Observed security level: NONE
at com.google.api.gax.rpc.ApiExceptionFactory.createException(ApiExceptionFactory.java:73)
[REQUIRED] Expected behavior
It should be possible to run queries on the local emulator for Firestore.
[REQUIRED] Actual behavior
Because of this catch-22 error setup, I don't believe there is a way to run queries on the local emulator for Firestore, at least not queries that involve "metadata."