解密/验证 Firebase 令牌

Posted

技术标签:

【中文标题】解密/验证 Firebase 令牌【英文标题】:Decrypt / Verify Firebase token 【发布时间】:2016-08-16 11:22:25 【问题描述】:

我正在使用带有电子邮件和密码身份验证的 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();

我也用下面的 sn-p 试过了:

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

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

【问题讨论】:

当用户登录时调用 getAuth() 将返回一个带有 uid 字段的对象。 firebase.com/docs/web/api/firebase/getauth.html @RonHarlev 我知道不幸的是我不想将 UID 以纯文本形式发送到我的服务器,因为这会使 JWT 背后的安全性变得毫无用处。即使我这样做了,我仍然需要验证令牌是否有效,而不是未经授权的第 3 方提出的一些生成的东西。 【参考方案1】:

您是否尝试过使用 getBytes 而不是 parseBase64Binary?示例如下:

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

【讨论】:

就是这样。非常感谢。

以上是关于解密/验证 Firebase 令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何针对 Firebase 验证身份验证令牌?

Firebase .NET 令牌验证

仅使用 Facebook 令牌在 iOS 上发送 Firebase 邀请登录 Firebase 身份验证

使用 Firebase 身份验证进行身份验证后检索 Google 访问令牌

使用 JWT 创建 Firebase 自定义身份验证令牌

Firebase 令牌身份验证错误