2017-03-31 105 views
1

我想實現從服務器端使用火力地堡管理員SDK(JAVA)的驗證令牌標識,但我得到的錯誤:火力地堡:無法解析服務帳戶:「PROJECT_ID」必須設置

無法解析服務帳戶:「PROJECT_ID」

我產生我在以下路徑憑據從火力點必須設置:

項目設置 - >服務帳戶,並生成一個新的私鑰和我有這樣的:

{ 
     "type": "service_account", 
     "project_id": "apilogintest-9c5f5", 
     "private_key_id": "<privateKeyId...>", 
     "private_key": "-----BEGIN PRIVATE KEY-----\n<a really big private Key>\n-----END PRIVATE KEY-----\n", 
     "client_email": "<clientEmail>", 
     "client_id": "<clientId>", 
     "auth_uri": "https://accounts.google.com/o/oauth2/auth", 
     "token_uri": "https://accounts.google.com/o/oauth2/token", 
     "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", 
     "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-hhay...." 
} 

也是我加載JSON文件的方式它了一樣的火力網頁:

對Maven:

enter image description here

用java加載我的JSON文件:

FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json"); 
    FirebaseOptions options = new FirebaseOptions.Builder() 
     .setCredential(FirebaseCredentials.fromCertificate(serviceAccount)) 
     .setDatabaseUrl("https://apilogintest-9c5f5.firebaseio.com/") 
     .build(); 
    FirebaseApp initializeApp = FirebaseApp.initializeApp(options); 

,當我試圖驗證令牌ID的最後一部分:

FirebaseAuth.getInstance(initializeApp).verifyIdToken(token) 
     .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() { 
      @Override 
      public void onSuccess(FirebaseToken decodedToken) { 
       String uid = decodedToken.getUid(); 
      } 
     }).addOnFailureListener(new OnFailureListener() { 
      @Override 
      public void onFailure(@NonNull Exception e) { 
       e.printStackTrace(); 

      } 
     }); 

我認爲我做了同樣的火力網頁提到,但我得到上述錯誤

有人可以幫助我嗎?

我將不勝感激您的幫助。

+0

您使用的是什麼版本的Admin Java SDK?你可以在最新的4.1.5版本上重現這一點嗎? – jwngr

+0

另外,你確定''path/to/serviceAccountKey.json''路徑實際上是你的JSON文件的正確路徑嗎?你可能引用了一個不存在的文件。 – jwngr

+0

你好,是我使用最新版本的firebase管理4.1.5和是我的文件的路徑對應於我的java路徑,所以我只指定我的文件的名稱,事實上在加載文件後,我打印它在控制檯,它就像json文件。 –

回答

0

我想出了這個問題。

問題是當我試圖重新驗證JSON對象,在控制檯中打印JSON對象時,我不想在設置Firebase選項之前用Stream執行任何過程(也不能使用BufferedReader),我的意思是,下面的代碼運行`噸,向我們展示了錯誤:

火力地堡:無法解析服務帳戶:「PROJECT_ID」必須設置

try { 
     String jsonData = streamToString(serviceAccount); 
     JSONObject jsonObject = new JSONObject(jsonData); 
     String projectId = jsonObject.getString("project_id"); 
     System.out.println(projectId); 
    } catch (JSONException e) { 
     throw new RuntimeException(e); 
    } 

FirebaseOptions options = new FirebaseOptions.Builder() 
      .setCredential(FirebaseCredentials.fromCertificate(serviceAccount)) 
      .setDatabaseUrl("https://apilogintest-9c5f5.firebaseio.com").build(); 
    initializeApp = FirebaseApp.initializeApp(options); 

但如果我直接加載文件,而不如下之前的任何塊代碼(無bufferedReader或jsonData = streamToSt環(serviceAccount); ....):

FirebaseOptions options = new FirebaseOptions.Builder() 
       .setCredential(FirebaseCredentials.fromCertificate(fl)) 
       .setDatabaseUrl("https://apilogintest-9c5f5.firebaseio.com").build(); 
     initializeApp = FirebaseApp.initializeApp(options); 

我不知道爲什麼這種行爲,但現在正在工作。

感謝您的支持!