Firebase如何发送有效载荷包含下划线字符的JWT令牌?

str*_*tek 1 javascript jwt firebase

总结问题

  • 带下划线字符的JWT令牌的有效载荷是否有效?据我了解,它不能,因为它必须是base64编码的。
  • 如果不是,为什么firebase有时会生成这样的令牌,为什么firebase Admin SDK可以对其进行验证和解码?
  • 如果是,请在哪里记录,以及如何在客户端上的javascript中读取有效负载(无需验证),因为atob这样的字符串将失败。

一些背景

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

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

在此处输入图片说明

这怎么可能?通过阅读JWT文档,我的理解是有效负载必须使用base64编码。除下划线外,所有字符实际上都是有效的base64字符。

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

ped*_*ofb 6

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

JWT令牌是base64url编码的,与base64略有不同。它改变了+-/_和消除拖尾=

如果不是,为什么firebase有时会生成这样的令牌,为什么firebase Admin SDK可以对其进行验证和解码?

_是有效的字符。往上看

如果是,请在哪里记录

RFC 7519 JSON Web令牌

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

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

只需更换-+_/得到一个base64。请参阅从此处提取的示例函数

function Base64DecodeUrl(str){
    str = (str + '===').slice(0, str.length + (str.length % 4));
    return str.replace(/-/g, '+').replace(/_/g, '/');
}
Run Code Online (Sandbox Code Playgroud)