Php Firebase IOS idToken在后端出现无效的'kid'异常,而在Gmail身份验证中出现'verifyIdToken'
我正在为Android和IOS应用程序使用firebase。应用程序具有专用后端,并使用Php Firebase IOS idToken在后端出现无效的'kid'异常,而在Gmail身份验证中出现'verifyIdToken',php,firebase,firebase-authentication,jwt,token,Php,Firebase,Firebase Authentication,Jwt,Token,我正在为Android和IOS应用程序使用firebase。应用程序具有专用后端,并使用verifyIdToken方法验证firebase在电话/电子邮件身份验证后发布的令牌。我正在验证新用户注册的令牌。这个概念在android应用程序中运行良好。当新用户进行身份验证时,将使用Firebase颁发的令牌调用注册API,我将使用服务帐户验证该令牌。但是,对于ios,它会失败,例外情况是kid头无效。这是异常跟踪 A key with ID "3494b1e786cdad092e423766bbe3
verifyIdToken
方法验证firebase在电话/电子邮件身份验证后发布的令牌。我正在验证新用户注册的令牌。这个概念在android应用程序中运行良好。当新用户进行身份验证时
,将使用Firebase颁发的令牌调用注册API,我将使用服务帐户
验证该令牌。但是,对于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密钥ID必须与中列出的公钥之一对应
当我在解码令牌后用谷歌的公钥检查key3494b1e786cdad092e423766bbe37f54ed87b22d
时,我没有找到匹配的kid
。但是,来自ios设备的令牌在成功身份验证后由firebase自己颁发。那么,在ios令牌中如何可能有不同的kid
头呢
我正在使用
kreait/firebase tokens php
库从后端访问服务帐户API。我发现了问题,ios设备中的行为与android不同,因为firebase实现。在ios中,firebase会将用户重定向到safari浏览器进行电子邮件登录,然后将流量返回到应用程序,这与android的行为不完全相同
我只是想破解firebase令牌aud
、iss
和“kid”标题不匹配,但看起来像是从web
发布的谷歌身份验证令牌,因此我从谷歌搜索并找到了线索。我在和中找到了ios firebase令牌的kid
头。好吧,我必须使用并成功验证令牌
在这种情况下,对于IOS设备,Firebase Admin SDK
中给出的方法verifyIdToken()
将根本不起作用。我认为Firebase应该更新他们的文档。在几次尝试联系他们后,都无法解决问题,相反,他们只是按下面给出的工具提示
我建议,对于iosGmail Auth
使用中给出的方法,而不是使用Firebase Admin SDK
的verifyIdToken()
,我打赌您使用的是Google idToken,而不是Firebase idToken。
你是怎么得到你的idToken的?
您可以通过以下api获取idToken:
Signin回调函数可能如下所示
var signInCb = function(authResult) {
var uid = authResult.user.uid;
authResult.user.getIdToken()
.then( idToken => {
// You can do some things with idToken here
....
})
}
谢谢你把这篇文章写下来并在这里分享——在过去的几周里,这个问题只向我报告了几次,但往往足以减少某种错误配置的可能性。由于我自己没有办法测试/复制这一点,也许@frank van puffelen对这个话题有一些见解或想法?到目前为止,我的假设是,在ID令牌发布后,公钥被轮换,但我认为这非常非常罕见。哦,天哪,你知道了,公钥是错误的,请不要认为android令牌的kid
头是正确的。我在ios上也遇到过这种情况。这种bug会影响已部署的系统,我失去了大约2k个用户。当我检查后端仪表板时,只有6.7k注册用户,在firebase auth上,计数为8.4k。表示有这么多用户已通过身份验证,但由于令牌验证错误而无法完成注册。已解决,Firebase文档
不正确。LOL@Kiran马尼亚。你是怎么解决的?如何更改firebase文档?你的意思是,谷歌公钥url不正确?一定是这样吗<代码>https://www.googleapis.com/service_accounts/v1/metadata/x509/my_firebase_service_account
@devcrazy下面的详细答案仍然无法解决,请随时联系我。谢谢您的详细描述。@Kiran Maniya我已将密钥URL从“”更改为“”,我可以找到匹配的孩子。但“aud”和“iss”声明与firebase官方文件不同。“iss”是“account.google.com”,而“aud”是“…uuid-like-string..apps.googleusercontent.com”。我的firebase项目是否配置错误?还是医生错了?谢谢看起来docs遗漏了一些重要的细节。您的项目配置很好。对于ios,firebase auth回调将返回google it令牌。