2016-04-22 189 views
2

我正在使用Firebase和電子郵件&密碼驗證。一旦用戶成功登錄,我將收到一個包含令牌的AuthData對象。
我想發送這個令牌到我的後端,驗證它並從中提取uid - 不幸的是我不知道該怎麼做。解密/驗證Firebase令牌

我知道Firebase的祕密,如果我去jwt.io,輸入令牌和祕密簽名驗證,我看到正確的有效載荷 - 所以這實際上工作。
由於我在我的後臺運行的Java我一直在使用jjwt的解密過程遺憾的是它總是拋出一個SignatureException

io.jsonwebtoken.SignatureException:JWT簽名不匹配本地計算簽名。 JWT有效性不能被斷言,也不應該被信任。

繼我一直在使用的代碼:

SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; 
byte[] encodedKey = Base64.decode("my-firebase-secret", Base64.DEFAULT); 
Key k = new SecretKeySpec(encodedKey, signatureAlgorithm.getJcaName()); 
Claims claims = Jwts.parser() 
        .setSigningKey(k) 
        .parseClaimsJws("the-token").getBody(); 

我也與下面的代碼段試了一下:

Claims claims = Jwts.parser() 
        .setSigningKey(DatatypeConverter.parseBase64Binary("my-firebase-secret")) 
        .parseClaimsJws(jwt).getBody(); 

但得到了同樣的異常。那麼我做錯了什麼?提前致謝。

+0

當用戶登錄調用getAuth()時,將返回一個帶有uid字段的對象。 https://www.firebase.com/docs/web/api/firebase/getauth.html –

+0

@RonHarlev我知道,不幸的是我不想以純文本發送UID到我的服務器,因爲這將呈現智威湯遜背後的安全性毫無用處。即使我這樣做,我仍然需要驗證令牌是否有效,而不是一些生成未授權第三方提出的東西。 – user3420815

回答

5

您是否嘗試過使用getBytes而不是parseBase64Binary?以下是示例:

Claims claims = Jwts.parser().setSigningKey("my-firebase-secret".getBytes("UTF-8")).parseClaimsJws(jwt).getBody(); 
+0

就是這樣。非常感謝你。 – user3420815