2016-06-10 48 views
1

我正在Android Studio中使用Google App Engine開發應用程序後端。我想使用Firebase所以它的一部分SDK的初始化是讀取一個Service帳戶的憑證JSON文件。我的文件添加到我的「src」目錄,並嘗試像火力地堡的文檔來閱讀:在我的Google App Engine項目中拒絕訪問文件

FirebaseOptions options = new FirebaseOptions.Builder() 
    .setServiceAccount(new FileInputStream("/src/serviceAccountCredentials.json")) 
    .setDatabaseUrl("https://databaseName.firebaseio.com/") 
    .build(); 

但它總是拋出一個訪問文件被拒絕例外:

java.security.AccessControlException: 
    access denied ("java.io.FilePermission" "/src/serviceAccountCredentials.json" "read") 

哪有我將讀取權限更改爲此文件? 謝謝:)

+0

你把它放到類路徑中,所以你應該將它作爲資源讀取(甚至在App Engine之外) –

+0

@IgorArtamonov你能舉個例子如何從這個文件獲取FileInputStream作爲資源嗎?或者如何將它添加爲類路徑?謝謝 –

+0

不是_file_輸入流,只是輸入流。我也會給出回答 –

回答

1

您位於源代碼目錄,所以編譯後它應該在classpatch的根目錄。但要確保它在那裏,它實際上取決於構建工具,其中一些可以忽略src dir中的非源文件,因爲這些文件應該位於resources dir中。如果你的情況,移動文件到資源目錄。

然後,讀取這個文件,你必須使用它作爲一種資源:

InputStream cred = this.getClass() 
      .getResourceAsStream("/serviceAccountCredentials.json"); 

FirebaseOptions options = new FirebaseOptions.Builder() 
     .setServiceAccount(cred) 
     .setDatabaseUrl("https://databaseName.firebaseio.com/") 
     .build(); 
+0

這不起作用... getResourcesAsStream返回null ...我也嘗試將json移動到資源目錄,而不是像你所說的src,仍然不工作:/任何其他可能的方式? –

+0

hm,你可以用斜槓試試嗎?即''/serviceAccountCredentials.json''?並確保它在輸出類dir –

+0

好吧,問題實際上是json位置......我將它放在項目的根目錄中,而不是放在主目錄中。現在它可以工作,謝謝! :) –

0

您需要添加的文件在您的AppEngine-web.xml文件中的標籤下。

<?xml version="1.0" encoding="utf-8"?> 
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> 
    <application>myApplicationId</application> 
    <version>1</version> 
    <threadsafe>true</threadsafe> 
    <system-properties> 
     <property name="java.util.logging.config.file" value="WEB-INF/logging.properties" /> 
    </system-properties> 
    <resource-files> 
     <include path="secret.json" /> 
    </resource-files> 
</appengine-web-app> 

這樣,你的應用程序引擎的服務器會知道,您使用的是隻讀這個靜態資源。