Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Firebase IOS idToken在后端出现无效的'kid'异常,而在Gmail身份验证中出现'verifyIdToken'_Php_Firebase_Firebase Authentication_Jwt_Token - Fatal编程技术网

Php Firebase IOS idToken在后端出现无效的'kid'异常,而在Gmail身份验证中出现'verifyIdToken'

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

我正在为Android和IOS应用程序使用firebase。应用程序具有专用后端,并使用
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必须与中列出的公钥之一对应

当我在解码令牌后用谷歌的公钥检查key
3494b1e786cdad092e423766bbe37f54ed87b22d
时,我没有找到匹配的
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应该更新他们的文档。在几次尝试联系他们后,都无法解决问题,相反,他们只是按下面给出的工具提示


我建议,对于ios
Gmail 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令牌。