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.
- Android Studio no puede procesar FloatingActionButton
- El método de punto final de Google mantiene la devolución "nombre no debe estar vacío" excepción
- Android studio - Ruta de SDK de App-Engine no válida
- Android y Google App Engine: compatibles XML vinculante herramienta disponible?
- Respuesta de Google Cloud Messaging Server lenta (1 minuto)
- Bloqueo de inicio de Eclipse, "SDK de Android: resolución de marcadores de error"
- Java.lang.NoClassDefFoundError: com.google.firebase.FirebaseOptions
- ¿Qué es una "Aplicación Web"?
- Google App Engine - escala automática con siempre en instancia?
- Puntos finales de Google Cloud: verifyToken: La longitud de la firma no es correcta
- java.awt.AWTError: Toolkit no encontrado: apple.awt.CToolkit Android appengineUpdate
- Objectify OfyService NoClassDefFoundError para el punto final del motor de la aplicación
- GoogleAuthException: desconocido al autenticar con puntos finales de Cloud
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>
.
- Android MotionEvent Puntero Indice Confusión
- Qt Android bluetooth socket escribir problemas en Android 5.1.1 y 6.0