2016-07-30 62 views
0

在舊版本的Firebase中,我用Java編寫的服務器應用程序將使用祕密和JWT令牌生成器與我的後端進行身份驗證。然後,在任何時候,我都可以撥打Firebase.getAuth().getToken()並在HTTP調用中重新使用該令牌作爲auth參數。通過REST API重新使用firebase-server-sdk憑證

隨着新的firebase-server-sdk,我將如何重新使用REST API有限的服務帳戶憑證/令牌?

Map<String, Object> auth = new HashMap<String, Object>(); 
auth.put("uid", "server-app"); 

FirebaseOptions options = new FirebaseOptions.Builder() 
      .setDatabaseUrl(Environment.FIREBASE_URL) 
      .setServiceAccount(MyClass.class.getResourceAsStream("/keys/dev.json")) 
      .setDatabaseAuthVariableOverride(auth) 
      .build(); 

FirebaseApp.initializeApp(options); 

那當我使用SDK認購/寫入到某些位置所有的偉大工程 - 特別是那些需要server-app UID位置。但是我在服務器應用程序中使用REST,因爲我希望我的服務器應用程序進行同步讀取,而Firebase只能通過REST API支持這些內容。

FirebaseRestClient firebaseRest = new RestAdapter.Builder() 
       .setEndpoint(Environment.FIREBASE_URL) 
       .setRequestInterceptor(new RequestInterceptor() { 
        @Override 
        public void intercept(final RequestFacade request) { 
         request.addQueryParam("access_token", FirebaseAuth.getInstance().createCustomToken("server-app")); 
        } 
       }) 
       .build().create(FirebaseRestClient.class); 

我試着將兩個access_tokenauth PARAM。似乎createCustomToken方法會生成有效的JWT,但REST API沒有響應。

當我通過在createCustomToken返回值作爲auth PARAM,我得到以下信息:

"error" : "Missing claim 'kid' in auth header." 

當我通過在createCustomToken返回值作爲access_token PARAM,我得到的基本Permission denied API響應。

有沒有一種簡單的方法可以在REST API調用中重用我現有的firebase-server-sdk憑據?

回答

1

您嘗試使用的令牌是Firebase身份驗證ID令牌 - 旨在傳遞給客戶端上的Firebase SDK的類型。 REST API接受Firebase訪問令牌(與以前的Firebase客戶端中的令牌一樣)。

您的身份驗證失敗,因爲通常情況下,Firebase SDK負責將您的ID令牌轉換爲訪問令牌。您的服務器可以而不是使用Firebase SDK執行此轉換或生成訪問令牌,因此我建議將原始Firebase Token Generator library與您的Firebase祕密配合使用以爲REST API創建訪問令牌。即使對於自I/O發佈後創建的新Firebase項目,這也可以正常工作。

注意:在控制檯中,可以在(齒輪圖標)>項目設置>數據庫下找到您的數據庫密鑰。

+0

Abe,你有這方面的更新,因爲數據庫的祕密現在被棄用? –

1

我敢肯定,這是不建議,因爲無證屬性的名稱,但...

如果你的SDK已經與serviceAccount登錄後,就可以使用firebase.auth().INTERNAL.getToken(),它返回一個承諾accessToken(和expirationTime),然後與?access_token參數一起使用。

+0

我應該補充說這是用於node.js SDK的。 –