5

Ich habe meine Dienstkontobestimmungs-JSON-Datei von der Firebase-Konsole heruntergeladen. Sie wurde früher im Hauptverzeichnis des GAE-Endpunktprojekts gespeichert.Firebase-Dienstkonto-Anmeldeinformationen Json Leseberechtigung verweigert

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

Ich versuchte, das auch, aber keine Hilfe .json Datei unter dem src Verzeichnis platzieren.

+0

Ich habe genau das gleiche Problem gerade jetzt. Ich habe versucht, es in meine Festplatte und Zugriff wie folgt: '.setServiceAccount (neue URL (" https: //drive.google.com/file/... ") .openStream())' aber ich bekomme Zugriff verweigert obwohl keine Berechtigungen es verhindern. Ich würde mich freuen, zu sehen, was die Leute mit – booky99

+0

kommen. Ich werde die Lösung posten, die ich heute Abend gefunden habe. Ich habe ein paar Arbeiten für Sie. Gib mir ungefähr 2 Stunden. – booky99

Antwort

0

Schließlich werfen tut, ich habe die Lösung gefunden, sein unter dem APIs und Referenzen Abschnitt von Google App Engine in dieser link geschrieben, dass wir Sie müssen solche Dateien in der Datei appengine-web.xml unter dem Tag <resource-files> mit der Eigenschaft <include path=""/> hinzufügen. Danach funktioniert es für mich. Ich habe die .json-Datei, die die Projektanmeldeinformationen enthält, im Verzeichnis WEB-INF abgelegt und dann unter <resource-files> den entsprechenden Pfad eingegeben.

+0

Wie sieht dein relativer Pfad aus? Ich erhalte diesen Fehler immer noch, nachdem ich ihn zum Ressourcendatei-Tag hinzugefügt habe. Vielleicht hat es mit dem Weg zu tun? Gibt es auch etwas anderes bei der Initialisierung von Firebase? Wie sieht der Pfad aus, um die Datei dort zu referenzieren? Vielen Dank –

0

Sie sollten die JSON-Datei setzen in src/main/resources

0

fand ich ein paar Möglichkeiten, dies zu nähern. Zuerst wird es aus einer Datei über einen Internet-Stream abgerufen. Das andere ist lokal.

INTERNET WAY

beteiligt Meine erste Methode, um die Datei auf meinem öffentlichen Dropbox-Ordner zu speichern. Ich habe die gemeinsam nutzbare Verbindung (stellen Sie sicher, es endet in .json) und klebte es in der Zeichenfolge Beispiel "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; 
    } 

LOCAL WAY

Die andere Möglichkeit, die Version oben nimmt und das Überspringen etwas wie 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; 
    } 

Ich weiß nicht, ob dies Best Practice folgt, aber mein Projekt funktioniert jetzt. Ich habe auch Firebase-Code für den Erhalt von Informationen enthalten. Schaut euch diese Antwort an: question Ich habe kürzlich beim Lesen und Schreiben von Firebase gefragt.

EDIT

gereinigt Version, die Fehler

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; 
    } 
} 
Verwandte Themen