2016-05-21 151 views
4

我目前正在開發一個由使用Firebase 2.4的Web應用程序調用的firebase 3.0的node.js服務。Firebase 3.0令牌:[錯誤:Firebase身份驗證ID令牌沒有「kid」聲明]

我在我的頭呼叫發送當前用戶Firebase ID tokenAuth.$getAuth().token),並試圖validade此令牌

var idToken = req.headers["x-access-token"]; 
auth.verifyIdToken(idToken).then(function(decodedToken) { 
    var uid = decodedToken.sub; 
    console.log(decodedToken); 
}, function(error){ 
    console.log(error); 
}); 

但我發現了:

[Error: Firebase Auth ID token has no "kid" claim] 

getAuth():

enter image description here


UPDATE

I'have只是測試生成和服務器端驗證令牌和我得到了同樣的問題。

var auth = firebase.auth(); 
var token = auth.createCustomToken(userId, {"premium_account": true}); 
console.log(token); 
auth.verifyIdToken(token).then(function(decodedToken) { 
    console.log(decodedToken); 
}, function(error){ 
    console.log(error); 
}); 

有什麼建議嗎?


更新2:[溶液]

在我的情況下的問題是,與AngularFire 2.X.X生成的令牌是不與在我的服務器運行火力地堡3.X.X兼容。所以挖掘到的一些想法的人寫在這裏和this google group topic後的解決方法是使用jsonwebtoken如下:

var jwt = require('jsonwebtoken'); 
jwt.verify(idToken, fbKey, function(err, decoded) { 
    if (!err){ console.log(decoded); } 
}); 

您可以找到fbKey訪問新的火力點控制檯,進入設置 - >項目設置 - >數據庫

+0

這看起來並不像使用3.0造了一個令牌。你不能混合和匹配象這樣的不同版本的令牌。不要試圖以服務器身份作爲用戶身份進行身份驗證,而是讓已通過身份驗證的用戶寫入數據庫中的安全路徑。讓服務器監控路徑。然後,您可以跳過RESTful服務和安全性(如果它們可以寫入需要身份驗證的安全路徑,則它們經過身份驗證和驗證)。因此,你可以繞過這整個混亂。 – Kato

+0

@Kato不錯。但那很奇怪。我在這裏做了一個測試,試圖在服務器端生成一個簡單的令牌,並使用相同的'verifyIdToken'來驗證該令牌,並且即時獲取相同的錯誤。它似乎不是一個兼容性問題。無論如何,你有沒有設置你剛剛提到的有關數據庫安全路徑的例子? – adolfosrs

+1

我也遇到了這個問題,並嘗試像您一樣進行服務器測試。在此處查看我的問題 - [錯誤:Firebase身份驗證ID令牌對Firebase 3.0沒有「kid」聲明] [1] [1]:https://groups.google.com/forum/#!topic/firebase-talk/ajMAi1RSsMA 看起來(令人困惑地)由createCustomToken生成的令牌與傳遞給verifyIdToken的令牌不同。 –

回答

2

該文檔指出,Firebase ID令牌與自定義令牌不同,並且該verifyIdToken()不用於驗證使用generateCustomToken()生成的令牌。

舊式自定義令牌似乎仍然有效(用數據庫密鑰而不是服務帳戶私鑰簽名)。您可以使用firebase-token-generator.js和/或jsonwebtoken.js自行生成並驗證這些內容。

從火力地堡項目複製>設置>數據庫>祕密

Create custom database authentication tokens using a legacy Firebase token generator. At least one secret must exist at all times.

3

似乎沒有辦法在情侶中使用firebase的createCustomToken和verifyIdToken。

方法createCustomToken使用來自jsonwebtoken模塊的方法符號,默認情況下它不會在jwt的頭部分中放置「kid」聲明。 而createCustomToken不會自行放置它。

我想在這個時候你可以直接使用jsonwebtoken模塊來生成具有自己的密鑰ID的令牌。

[email protected]

[email protected]

+0

感謝您的回覆。只是在解決方案的更多細節上更新了問題。 – adolfosrs

2

傳遞到服務器的標記不是JWT令牌,並verifyIdToken需要JWT令牌。

要在您的Web應用程序中獲得JWT令牌,請運行firebase.app().auth().currentUser.getToken()

Personnally我刪除了angularfire,基本的firebase框架使angularfire在我看來很無用。此外,與firefire 3.0的angularfire兼容的版本尚未發佈,可能在the next week according to the firebase team

相關問題