firebase 如何发送有效载荷包含下划线字符的 JWT 令牌?
Posted
技术标签:
【中文标题】firebase 如何发送有效载荷包含下划线字符的 JWT 令牌?【英文标题】:How could firebase send a JWT token which payload contains an underscore character? 【发布时间】:2018-08-11 11:28:32 【问题描述】:总结问题
带有下划线字符的 JWT 令牌有效负载是否有效?据我了解,它不能,因为它必须是 base64 编码的。 如果不是,为什么 firebase 有时会生成这样的令牌,为什么 firebase Admin SDK 能够验证和解码它? 如果是,那么记录在哪里以及如何在客户端上读取 javascript 中的有效负载(无需验证),因为atob
将在这样的字符串上失败。
一些上下文
我正在使用 firebase 进行身份验证。我想阅读(不验证)id 令牌的有效负载。我需要它来显示/隐藏 UI 中的内容,并且我使用了 firebase documentation 中描述的方法。
但是在某些情况下(我只在使用我的 facebook 帐户登录时才会体验到它),令牌的有效负载包含 _
,因此不是 base64 解码的。因此我在调用atob
时遇到错误。
这怎么可能?我阅读 JWT 文档的理解是,有效负载必须是 base64 编码的。除了下划线之外,所有字符实际上都是有效的 base64 字符。
但是,当我将令牌发送到 firebase 函数并在其上调用 admin.auth().verifyIdToken(idToken)
时,令牌已成功验证和解码。
【问题讨论】:
请发布完整的令牌 【参考方案1】:带有下划线字符的 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, '/');
【讨论】:
以上是关于firebase 如何发送有效载荷包含下划线字符的 JWT 令牌?的主要内容,如果未能解决你的问题,请参考以下文章
Firebase FCM - 为什么我得到:有效载荷错误,无效的'android'(或'apns')属性
有效载荷 4096 字节是不是包含registration_id 长度?