firebase如何发送一个JWT令牌,哪个有效负载包含下划线字符?

时间:2018-03-03 09:48:08

标签: javascript firebase jwt

汇总问题

  • 带有下划线字符的JWT令牌的有效负载是否有效?根据我的理解,它不能,因为它必须是base64编码。
  • 如果没有,为什么firebase有时会生成这样的令牌?为什么firebase Admin SDK能够验证并解码它?
  • 如果是,那么文档记录在哪里,如何在客户端上的javascript中读取有效负载(不进行验证),因为atob将在这样的字符串上失败。

某些背景

我正在使用firebase进行身份验证。我想读取(不验证)id令牌的有效负载。我需要它来显示/隐藏UI中的内容,并且我使用了firebase documentation中描述的方法。

但是在某些情况下(我只在用我的facebook帐户登录时才会遇到),令牌的有效负载包含_,因此不是base64解码的。因此,在调用atob时出现错误。

enter image description here

这怎么可能?我从阅读JWT文档中了解到,有效载荷必须是base64编码的。除了下划线外,所有字符实际上都是有效的base64字符。

但是,当我将令牌发送到firebase函数并在其上调用admin.auth().verifyIdToken(idToken)时,该令牌已成功验证并解码。

1 个答案:

答案 0 :(得分:3)

  

JWT令牌的带有下划线字符的有效负载是否有效?根据我的理解,它不能,因为它必须是base64编码。

JWT令牌是base64url编码的,与base64略有不同。它会将+更改为-,将/更改为_并删除尾随=

  

如果没有,为什么firebase有时会生成这样的令牌?为什么firebase Admin SDK能够验证并解码它?

_是一个有效的字符。见上文

  

如果是,则记录在哪里

RFC 7519 JSON Web Token

  

JWT表示为由句点('。')字符分隔的URL安全部分序列。每个部分都包含base64url编码的值。

     

如何在客户端上读取javascript中的有效负载(无需验证),因为atob将在这样的字符串上失败。

只需将-替换为+,将_替换为/即可获得base64。查看从here

中提取的示例函数
function Base64DecodeUrl(str){
    str = (str + '===').slice(0, str.length + (str.length % 4));
    return str.replace(/-/g, '+').replace(/_/g, '/');
}