当前位置: 首页 > 知识库问答 >
问题:

在Gmail身份验证中“验证idToken”时,后端出现Firebase IOS idToken无效的“kid”异常

沙星波
2023-03-14

我正在使用firebase的Android和IOS应用程序。该应用程序有专门的后端,并在电话/电子邮件认证后使用< code>verifyIdToken方法验证firebase发出的令牌。我正在验证新用户注册的令牌。这个概念在android应用程序上运行良好。当新用户< code >通过身份验证时,将使用Firebase发布的令牌调用注册API,我正在使用< code >服务帐户验证该令牌。但是,对于ios,它会失败,例外情况是< code>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 Documentation中,明确指出

儿童密钥 ID 必须与 https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com 中列出的公钥之一相对应

当我在解码令牌后用google的公钥检查key3494b1e786cdad092e423766bbe37f54ed87b22d时,我没有找到匹配的儿童。但是,来自ios设备的令牌是由Firebase自己在成功身份验证后发出的。那么ios令牌中怎么可能有不同的儿童标头呢?

我使用kreait/firebase-Tokens-php库从后端访问服务号API。

共有2个答案

璩涵衍
2023-03-14

我敢打赌,你使用的是谷歌id令牌,而不是火基id令牌。你是怎么得到你的偶像令牌的?您可以通过此 api 获得 id令牌: https://firebase.google.com/docs/reference/js/firebase.User#getidtoken

Signin回调函数可能像以下一样。

var signInCb = function(authResult) {
    var uid = authResult.user.uid;
    authResult.user.getIdToken()
        .then( idToken => {
            // You can do some things with idToken here
                ....
        })
}
竺辉
2023-03-14

我发现了问题,由于firebase实现,ios设备中的行为与android不一样。在ios中,firebase将用户重定向到safari浏览器以进行电子邮件登录,然后将流返回到应用程序,这与android的行为完全不同。

我只是四处寻找并解码了Firebase令牌。audiss和“孩子”标头不匹配,但看起来像是从web发出的谷歌身份验证令牌,因此我从谷歌查看了Web登录后端身份验证文档,发现了一条线索。我在JWK和PEM中找到了ios Firebase令牌孩子标头。好吧,我必须使用Google API客户端库并成功验证令牌。

在这种情况下,对于 IOS 设备,火库管理 SDK 官方文档中给出的火库管理 SDK验证 IdToken() 方法将根本不起作用。我认为火基地应该更新他们的文档。经过几次尝试联系他们无法解决问题,相反,他们只是按下下面给出的工具提示,

我建议ios Gmail Auth使用Web后端Auth中给出的方法,而不是使用< code>Firebase Admin SDK的< code>verifyIdToken()。

 类似资料:
  • 我正在尝试使用paramiko对设备进行ssh操作,并在虚拟环境中使用以下代码运行一些命令 从getpass导入paramiko导入getpass 如果name==“main”: 当我尝试运行上面的代码时,我得到以下错误: 文件“param.py”,第14行,s.connect(hostname=主机名,username=用户名,password=密码)文件“/users/myuser/myvir

  • 我无法验证由v2终结点发布的Azure idToken的令牌签名。 我已经阅读了文件(https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-id-and-access-tokens#validating-标记),还有一些示例代码,但这是指TS/JS以外的语言。 目前我的代码是 我该怎么做呢?解码有效,但验证无效。 场地

  • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工

  • 我正在使用DataStax驱动程序连接到Cassandra节点。下面是连接器的代码。 验证器:PasswordAuthenticator 调用connect方法时,显示以下错误: 主机LocalHost/127.0.0.1:9042上的身份验证错误:主机LocalHost/127.0.0.1:9042需要身份验证,但在群集配置中找不到身份验证器 编辑:异常堆栈位于

  • 在用户使用JNDIRealm身份验证登录Tomcat期间,我在Catalina日志中收到以下错误: 2018年6月26日12:08:29.547严重[http-nio-8080-exec-7]组织。阿帕奇。卡特琳娜。领域JNDIRealm。执行身份验证javax时发生身份验证异常。命名。AuthenticationException:[LDAP:错误代码49-80090308:LDAPPER:DS

  • 我使用以下代码发送XML请求: 但有时我会犯这个错误: 当我得到错误401时,我如何捕捉和处理异常?如果可能的话,我希望处理行之后的异常。