Firebase IOS idToken无效的`kid`后端异常,而Gmail Auth中的`verifyIdToken`
Posted
技术标签:
【中文标题】Firebase IOS idToken无效的`kid`后端异常,而Gmail Auth中的`verifyIdToken`【英文标题】:Firebase IOS idToken invalid `kid` Exception in backend while `verifyIdToken` in Gmail Auth 【发布时间】:2020-01-03 14:14:27 【问题描述】:我正在为 android 和 ios 应用程序使用 firebase。该应用程序具有专用的后端,并使用verifyIdToken
方法在电话/电子邮件身份验证后验证firebase 颁发的令牌。我正在验证新用户注册的令牌。这个概念适用于 android 应用程序。当新用户Authenticates
时,将使用 Firebase 颁发的令牌调用注册 API,我正在使用 Service Account
验证该令牌。但是,对于 ios,它会失败,但 kid
标头无效。这是异常跟踪。
A key with ID "3494b1e786cdad092e423766bbe37f54ed87b22d" could not be found.
"exception":"[object] (Firebase\\Auth\\Token\\Exception\\UnknownKey(code: 0):
A key with ID \"3494b1e786cdad092e423766bbe37f54ed87b22d\" could not be found.
at /home/fgx3uhiothty/public_html/vendor/kreait/firebase-tokens/src/Verifier.php:132)
在 Firebase Auth 文档中,明确指出
kid Key ID 必须对应于https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com 列出的公钥之一
当我在解码令牌后用谷歌的公钥检查密钥3494b1e786cdad092e423766bbe37f54ed87b22d
时,我没有找到匹配的kid
。但是,来自 ios 设备的令牌是在成功验证后由 firebase 本身发出的。那么如何在 ios 令牌中有不同的 kid
标头?
我正在使用 kreait/firebase-tokens-php
库从后端访问服务帐户 API。
【问题讨论】:
感谢您撰写本文并在此分享 - 在过去几周内仅向我报告了几次该问题,但通常足以降低某种错误配置的可能性。由于我自己没有办法测试/重现这个,也许@frank-van-puffelen 对此主题有一些见解或想法?到目前为止,我的假设是公钥在 ID 令牌发行后轮换,但我认为这非常非常罕见。 天哪,你明白了,公钥错误,请注意android令牌的kid
标头是正确的。 ios发生在我身上。这种错误会影响已部署的系统,我失去了大约 2k 用户。当我检查后端仪表板时,只有 6.7k 注册用户并且在 firebase auth 上,计数为 8.4k。表示有这么多用户通过了身份验证,但由于令牌验证错误而无法完成注册。
已解决,Firebase Docs
不正确。哈哈
@Kiran Maniya。你是怎么解决的?如何更改 firebase 文档?你的意思是,谷歌公钥网址不正确?一定要这样吗? https://www.googleapis.com/service_accounts/v1/metadata/x509/my_firebase_service_account
@devcrazy 下面详细解答,还是解决不了,欢迎联系我。
【参考方案1】:
我发现了这个问题,由于 firebase 实现,ios 设备中的行为与 android 不同。在 ios 中,firebase 将用户重定向到 safari 浏览器进行电子邮件登录,然后将流程返回到应用程序,这与 android 行为并不完全相同。
我刚刚解决并解码了 firebase 令牌。 aud
,iss
和 'kid' 标头不匹配,但看起来像是从 web
发出的谷歌身份验证令牌,因此我从谷歌查看了 Web Sign-in Backend Auth Docs 并找到了线索。我在JWK 和PEM 中找到了ios firebase token
的kid
标头。好吧,我必须使用Google API Client Library
并成功验证令牌。
在这种情况下,对于IOS设备,Firebase Admin SDK
中Firebase Admin SDK Official Docs中给出的方法verifyIdToken()
根本不起作用。我认为 Firebase 应该更新他们的文档。经过几次尝试与他们联系后无法解决问题,他们只是按下了如下所示的工具提示,
我建议,对于 ios Gmail Auth
使用 Web Backend Auth 中给出的方法,而不是使用 verifyIdToken()
的 Firebase Admin SDK
。
【讨论】:
感谢您的详细描述。@Kiran Maniya 我已将 KEYS_URL 从“googleapis.com/robot/v1/metadata/x509/…”更改为“googleapis.com/oauth2/v1/certs”我可以找到匹配的孩子。但是“aud”和“iss”声明与 firebase 官方文档不同。 “iss”是“account.google.com”,“aud”是“...uuid-like-string..apps.googleusercontent.com”。我的 Firebase 项目是否配置错误?还是文档有误?谢谢 看起来文档遗漏了一些重要的细节。你的项目配置没问题。【参考方案2】:我敢打赌,您使用的是 Google idToken,而不是 firebase idToken。 您是如何获得 idToken 的? 您可以通过此 api 获取 idToken: https://firebase.google.com/docs/reference/js/firebase.User#getidtoken
登录回调函数可能如下所示。
var signInCb = function(authResult)
var uid = authResult.user.uid;
authResult.user.getIdToken()
.then( idToken =>
// You can do some things with idToken here
....
)
【讨论】:
在 ios 的情况下,firebase auth 回调返回 google it 令牌。以上是关于Firebase IOS idToken无效的`kid`后端异常,而Gmail Auth中的`verifyIdToken`的主要内容,如果未能解决你的问题,请参考以下文章
IdToken()和Uid()在firebase中有什么区别
Firebase admin sdk:用于授权的 idToken 或自定义令牌验证
如何使用 apollo Reactjs 客户端刷新 Firebase IdToken
Firebase Auth idToken 大小为 900 个字符是不是正常?
将带有完成处理程序的 Firebase IdToken 添加到每个 AlamoFire 请求
expo firebase google signin 给出:第一个参数“idToken”必须是有效字符串或有效对象或 null