Firebase IOS idToken无效的`kid`后端异常,而Gmail Auth中的`verifyIdToken`

时间:2019-08-30 10:10:50

标签: php firebase firebase-authentication jwt token

我正在将Firebase用于Android和IOS应用程序。该应用程序具有专用的后端,并在使用verifyIdToken方法对电话/电子邮件进行身份验证之后验证firebase发出的令牌。我正在验证新用户注册的令牌。这个概念对于android应用程序来说很好用。当新用户Authenticates时,将使用Firebase发行的令牌调用Registration 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文档中,有明确说明

  

儿童密钥ID必须与https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com

中列出的公共密钥之一相对应。

在解码令牌后,我用Google的公钥检查了密钥3494b1e786cdad092e423766bbe37f54ed87b22d时,找不到kid匹配项。但是,成功进行身份验证后,firebase会从ios设备发出令牌。那么,如何在ios令牌中使用不同的kid标头?

我正在使用kreait/firebase-tokens-php库从后端访问服务帐户API。

2 个答案:

答案 0 :(得分:0)

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

我刚刚解决了Firebase令牌并对其进行了解码。 audiss和'kid'标头不匹配,但看起来像是由web发行的google auth令牌,因此我从google调查了Web Sign-in Backend Auth Docs并找到了线索。我在JWKPEM中找到了kid的{​​{1}}头。好吧,我必须使用Google API Client Library并成功验证令牌。

在这种情况下,对于IOS设备,Firebase Admin SDK Official Docs中给出的ios firebase token的方法verifyIdToken()将根本无法使用。我认为Firebase应该更新其文档。经过几次尝试无法解决问题后,他们只是按如下所示推动了工具提示,

Tooltip from firebase Docs

我建议,对于ios Firebase Admin SDK,请使用Web Backend Auth中给出的方法,而不要使用Gmail Auth中的verifyIdToken()

答案 1 :(得分:0)

我敢打赌,您使用的是 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
                ....
        })
}