2017-02-05 49 views
0

我試圖驗證用戶的ID令牌。每當我叫verifyIdToken功能以下錯誤被拋出:Firebase Java管理員SDK錯誤

java.lang.IllegalArgumentException異常:專案編號必須設置

下面是servlet代碼:

public class GeneratorInfoServlet extends HttpServlet { 
    FirebaseApp app = null; 

    @Override 
    public void init(ServletConfig config) { 
     InputStream serviceAccount = Thread.currentThread().getContextClassLoader() 
       .getResourceAsStream("/WEB-INF/service_key.json"); 

     FirebaseOptions options = new FirebaseOptions.Builder() 
       .setCredential(FirebaseCredentials.fromCertificate(serviceAccount)) 
       .setDatabaseUrl("https://project-id.firebaseio.com/") 
       .build(); 

     this.app = FirebaseApp.initializeApp(options); 

    } 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     PrintWriter out = resp.getWriter(); 
     StringBuffer tokenBuffer = new StringBuffer(); 
     String line; 

     try { 
      BufferedReader reader = req.getReader(); 
      while ((line = reader.readLine()) != null) 
       tokenBuffer.append(line); 

      this.verifyToken(tokenBuffer.toString()); 
      out.print("{'success': false}"); 
     } catch (Exception e) { 
      System.err.print(e); 
      out.print("{'success': true}"); 
     } 
    } 

    private void verifyToken(String idToken) { 
     System.out.println(app); 
     FirebaseAuth.getInstance(this.app).verifyIdToken(idToken) 
       .addOnSuccessListener(decodedToken -> { 
        String uid = decodedToken.getUid(); 
        System.out.println(uid); 
       }).addOnFailureListener(e -> System.out.println(e)); 
    } 
} 

我已經一直在通過文檔,我沒有找到如何直接設置項目ID的方法。不過,我認爲它首先不應該是必需的,因爲它已經寫入了service_key和數據庫url。

謝謝!

編輯:

內置FirebaseOptions建設者

常規的Java SDK(非管理員)已setApplicationId( 「PROJECT_ID」)功能。但是,有在管理SDK沒有這樣的選擇

回答

1

我初始化我的火力地堡的應用程序有點不同,看到我的代碼

InputStream in = Thread.currentThread().getContextClassLoader() 
       .getResourceAsStream("/WEB-INF/service_key.json"); 

FirebaseOptions options = new FirebaseOptions.Builder() 
        .setServiceAccount(in) 
        .setDatabaseUrl(".....") 
        .build(); 

這是爲我工作與管理SDK版本4.0.4

+1

我我一直在使用最新的Admin SDK 4.1.1,其中不推薦使用setServiceAccont方法。我試圖降級到你的版本之後,我得到了NullPointerException。事實證明,InputStream爲空,並且較新的SDK版本沒有檢查空值,並拋出誤導性的「projectId must be set」錯誤。非常感謝,你的評論讓我對問題的核心 –

+1

嘎,對不起!我們將在即將發佈的版本中更新這個版本,以便爲這種情況提供更好的錯誤。 – jwngr

+0

沒問題。謝謝 –