Правила безопасности Firestore, разрешают чтение и запись, если ключ WEB API находится в запросе Https
Я отправляю запросы GET, POST, PATCH и DELETE в Firestore с помощью HttpsURLConnection.
private static final String REST_HEADER = "https://firestore.googleapis.com/v1beta1/projects/[my project id]/databases/(default)/documents/";
// Build URL
String FirestoreURL = REST_HEADER + [my document path] + "?key=" + [my web api key];
// Create URL
URL cloudFirestoreEndPoint = new URL(FirestoreURL);
// Create connection
myHttpsConnection = (HttpsURLConnection) cloudFirestoreEndPoint.openConnection();
// Set Request Method
myHttpsConnection.setRequestMethod("PATCH");
// Set Writable
myHttpsConnection.setDoOutput(true);
// Set Https Connection properties
myHttpsConnection.setRequestProperty("Content-Type", "application/json");
// Create output stream linked to our https connection
OutputStreamWriter streamWriter = new OutputStreamWriter(myHttpsConnection.getOutputStream());
// Write to buffer
streamWriter.write([my json]);
// Send out the buffer
streamWriter.flush();
// Close the stream
streamWriter.close();
// disconnect
myHttpsConnection.disconnect();
Я хотел бы знать, как настроить правило базы данных Firestore так, чтобы любой запрос на чтение и запись содержал правильный "?ключ= " [мой ключ Web api] разрешен.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request == 'MY WEB API KEY???';
}
}
}
Как бы вы написали это в Firestore?
1 ответ:
Вот как я решил эту проблему. Вы отправляете запрос на маркер в конечной точке googleapis. Вы получите полезную нагрузку, содержащую длинный ключ, который затем нужно добавить ко всем вашим путям, get, post,... запрос.
Вот запрос на получение токена
// Build URL String authenticationURL = "https://www.googleapis.com/identitytoolkit/v3/relyingparty"; if(methodType_.equals("SIGN_UP")){ authenticationURL = authenticationURL + "/signupNewUser"; }else if(methodType_.equals("SIGN_IN")){ authenticationURL = authenticationURL + "/verifyPassword"; }else{ return null; } authenticationURL = authenticationURL + "?key=" + webApiKey_; // Create URL URL endPointURL = new URL(authenticationURL); // Create connection myHttpsConnection = (HttpsURLConnection) endPointURL.openConnection(); // Set Request Method myHttpsConnection.setRequestMethod("POST"); // Set Writable myHttpsConnection.setDoOutput(true); // Set Https Connection properties myHttpsConnection.setRequestProperty("Content-Type", "application/json"); // Generate JSON from the data String myJSON_str = "{\"email\":\"" + email,\"password\":\"" + password_ + "\",\"returnSecureToken\":true}"; JSONObject myJSON = new JSONObject(myJSON_str); // Create output stream linked to our https connection OutputStreamWriter streamWriter = new OutputStreamWriter(myHttpsConnection.getOutputStream()); // Write to buffer streamWriter.write(myJSON.toString()); // Send out the buffer streamWriter.flush(); // Close the stream streamWriter.close(); // Get Response Code myResponseCode = myHttpsConnection.getResponseCode(); // If connection successful if (myResponseCode == HttpURLConnection.HTTP_OK) { // Get Input Stream InputStream streamReader = myHttpsConnection.getInputStream(); InputStreamReader responseBodyReader = new InputStreamReader(streamReader, "UTF-8"); // Buffer the inputstream BufferedReader br = new BufferedReader(responseBodyReader); // Create JsonReader from input stream JsonReader jsonReader = new JsonReader(br); // My custom method to convert a JSON to a readable thing ArrayList<Field_Value> myFields = JSON_Methods.convertFirestoreJSON(jsonReader); // Close Streams jsonReader.close(); br.close(); responseBodyReader.close(); streamReader.close(); // Get The IdToken Field idToken_ = Field_Value.getFieldValue(myFields,"idToken"); }
После того, как вы добавите это ко всем вашим get, patch, post.. запросы,
// Set Authorization header myHttpsConnection.setRequestProperty("Authorization", "Bearer " + idToken_);