Credenciales de la cuenta de servicio de Firebase Permiso de lectura de Json leído

He descargado mi archivo de json de la credencial de la cuenta de servicio de la consola de Firebase lo colocó más temprano en el directorio principal del proyecto del punto final de GAE cuando ejecuto mi respaldo local él da la excepción de la seguridad.

java.security.AccessControlException: access denied ("java.io.FilePermission" "\src\main\secret.json" "read") 

Intenté poner el archivo .json debajo del directorio del src también pero ninguna ayuda.

Debe colocar el archivo json en src/main/resources

Encontré un par de maneras de abordar esto. Primero está obteniéndolo de un archivo a través de un flujo de Internet. El otro es local.

CAMINO DE INTERNET

Mi primer método consistió en almacenar el archivo en mi carpeta pública. Conseguí el acoplamiento shareable (cerciórese de que termina en .json ) y lo pegué en el ejemplo de la secuencia "https://dl.dropboxusercontent.com/..EXAMPLE-CREDENTIALS"

 /** A simple endpoint method that takes a name and says Hi back */ @ApiMethod(name = "sayHi") public MyBean sayHi(@Named("name") String name) { MyBean mModelClassObject = null; String text = ""; try { String line = ""; StringBuilder builder = new StringBuilder(); URL url = new URL("https://dl.dropboxusercontent.com/..EXAMPLE-CREDENTIALS"); BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); while ((line = reader.readLine()) != null) { // ... builder.append(line); } reader.close(); text = builder.toString(); } catch (MalformedURLException e) { // ... } catch (IOException e) { // ... } InputStream stream = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)); FirebaseOptions options = null; options = new FirebaseOptions.Builder() .setServiceAccount(stream) .setDatabaseUrl("https://[PROJECT-ID].firebaseio.com/") .build(); FirebaseApp.initializeApp(options); DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); final TaskCompletionSource<MyBean> tcs = new TaskCompletionSource<>(); Task<MyBean> tcsTask = tcs.getTask(); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { MyBean result = dataSnapshot.getValue(MyBean.class); if(result != null){ tcs.setResult(result); } } @Override public void onCancelled(DatabaseError databaseError){ //handle error } }); try { mModelClassObject = Tasks.await(tcsTask); }catch(ExecutionException e){ //handle exception }catch (InterruptedException e){ //handle exception } return mModelClassObject; } 

CAMINO LOCAL

La otra manera es tomar la versión de arriba y saltar algo como dropbox

 /** A simple endpoint method that takes a name and says Hi back */ @ApiMethod(name = "sayHi") public MyBean sayHi(@Named("name") String name) { MyBean mModelClassObject = null; String text = "JUST PASTE YOUR JSON CONTENTS HERE"; InputStream stream = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)); FirebaseOptions options = null; options = new FirebaseOptions.Builder() .setServiceAccount(stream) .setDatabaseUrl("https://[PROJECT-ID].firebaseio.com/") .build(); FirebaseApp.initializeApp(options); DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); final TaskCompletionSource<MyBean> tcs = new TaskCompletionSource<>(); Task<MyBean> tcsTask = tcs.getTask(); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { MyBean result = dataSnapshot.getValue(MyBean.class); if(result != null){ tcs.setResult(result); } } @Override public void onCancelled(DatabaseError databaseError){ //handle error } }); try { mModelClassObject = Tasks.await(tcsTask); }catch(ExecutionException e){ //handle exception }catch (InterruptedException e){ //handle exception } return mModelClassObject; } 

No sé si esto sigue las mejores prácticas, pero mi proyecto está funcionando ahora. También incluí el código de firebase para conseguir la información. Echa un vistazo a esta respuesta a una pregunta que he hecho recientemente sobre la lectura y la escritura a firebase.

EDITAR

Versión limpia que no lanza errores

 public class MyEndpoint { private FirebaseOptions options; private DatabaseReference ref; private String serviceAccountJSON = "i took mine out for security reasons"; // create firebase instance if need be private void connectToFirebase(){ if (options == null) { options = null; options = new FirebaseOptions.Builder() .setServiceAccount(new ByteArrayInputStream(serviceAccountJSON.getBytes(StandardCharsets.UTF_8))) .setDatabaseUrl("https://[PROJECT-ID].firebaseio.com/") .build(); FirebaseApp.initializeApp(options); } if(ref == null) { ref = FirebaseDatabase.getInstance().getReference(); } } /** A simple endpoint method that takes a name and says Hi back */ @ApiMethod(name = "sayHi") public MyBean sayHi(@Named("name") String name) { // always do this first connectToFirebase(); MyBean mModelClassObject = null; final TaskCompletionSource<MyBean> tcs = new TaskCompletionSource<>(); Task<MyBean> tcsTask = tcs.getTask(); // get the info ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { MyBean result = dataSnapshot.getValue(MyBean.class); if(result != null){ tcs.setResult(result); } } @Override public void onCancelled(DatabaseError databaseError){ //handle error } }); // wait for it try { mModelClassObject = Tasks.await(tcsTask); }catch(ExecutionException e){ //handle exception }catch (InterruptedException e){ //handle exception } mModelClassObject.setData(mModelClassObject.getData() + name); return mModelClassObject; } } 

Por último, encontré la solución, Su escrito en la sección de APIs y referencias de Google App Engine en este enlace , que tenemos que añadir estos archivos en el archivo appengine-web.xml en la etiqueta <resource-files> , utilizando <include path=""/> propiedad. Después de hacer esto sus trabajos para mí. Coloque el archivo .json que contiene las credenciales del proyecto en el directorio WEB-INF y luego introdujo su ruta relativa en la etiqueta <resource-files> .

  • Obtener de android a motor de aplicaciones de Google
  • Con Android, ¿cómo establezco el plazo máximo para una solicitud de Cloud Endpoint?
  • Permitir que sólo mis aplicaciones Android ejecuten api de punto final en java
  • ¿Tengo que usar CollectionResponse como un tipo de retorno en GAE Endpoints API o puedo usar colecciones java de entidades?
  • Variedad de errores en la aplicación Mobile Backend Starter Sample
  • No se puede importar el punto final del motor de la aplicación en mi EndpointsAsyncClass en Android Studio
  • Google App Engine - Demasiadas operaciones de lectura de almacenes de datos
  • GAE no reconoce la cookie?
  • Convertir una cadena en número de coma flotante en java
  • Google App Engine con Android: prueba de puntos finales en dispositivos reales
  • Generar la biblioteca de cliente de punto final de nube de repente dejó de funcionar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.