解密/验证Firebase令牌

use*_*815 2 java android jwt firebase

我正在使用Firebase进行电子邮件和密码身份验证.一旦用户成功登录,我将收到一个AuthData包含令牌的对象.
我想把这个令牌发送到我的后端,验证并从中提取uid- 不幸的是我不知道该怎么做.

我知道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();
Run Code Online (Sandbox Code Playgroud)

我也尝试过以下代码片段:

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

但得到了同样的例外.那么我做错了什么?提前致谢.

Yar*_*vyn 5

您是否尝试过使用getBytes而不是parseBase64Binary?这是一个例子:

Claims claims = Jwts.parser().setSigningKey("my-firebase-secret".getBytes("UTF-8")).parseClaimsJws(jwt).getBody();
Run Code Online (Sandbox Code Playgroud)