解密/验证 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 令牌的主要内容,如果未能解决你的问题,请参考以下文章
仅使用 Facebook 令牌在 iOS 上发送 Firebase 邀请登录 Firebase 身份验证