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 长度?

如何使用 FCM 向 iOS 发送通知?

如何通过html中的form标签发送换行符“\n”

iOS Swift 使用 Firebase 云消息发送丰富的推送通知

Firebase FCM - 为啥会收到:有效负载错误,无效的“android”(或“apns”)属性