atob
将在这样的字符串上失败。我正在使用firebase进行身份验证。我想读取(不验证)id令牌的有效负载。我需要它来显示/隐藏UI中的内容,并且我使用了firebase documentation中描述的方法。
但是在某些情况下(我只在用我的facebook帐户登录时才会遇到),令牌的有效负载包含_
,因此不是base64解码的。因此,在调用atob
时出现错误。
这怎么可能?我从阅读JWT文档中了解到,有效载荷必须是base64编码的。除了下划线外,所有字符实际上都是有效的base64字符。
但是,当我将令牌发送到firebase函数并在其上调用admin.auth().verifyIdToken(idToken)
时,该令牌已成功验证并解码。
答案 0 :(得分:3)
JWT令牌的带有下划线字符的有效负载是否有效?根据我的理解,它不能,因为它必须是base64编码。
JWT令牌是base64url编码的,与base64略有不同。它会将+
更改为-
,将/
更改为_
并删除尾随=
如果没有,为什么firebase有时会生成这样的令牌?为什么firebase Admin SDK能够验证并解码它?
_
是一个有效的字符。见上文
如果是,则记录在哪里
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, '/');
}