【问题标题】:How can I verify firebase token server side?如何验证 Firebase 令牌服务器端?
【发布时间】:2017-10-30 02:28:13
【问题描述】:

我有一个 firebase 帐户,我在其中手动创建能够使用我的网站的用户(注册不公开,但与此查询无关)

在登录页面中,通过javascript进行身份验证。
一旦用户输入他们的邮件和密码,相应的函数就会被执行,我得到令牌并通过 url 重定向将它发送到我的 PHP 服务器。像这样的:

firebase.auth().signInWithEmailAndPassword(inputemail, inputpassw)
    .then( function(user) {

        myEmail = user.email;
        myUid = user.uid;

        user.getIdToken()
            .then( function(token){
                myToken = token;

                location.href = "http://www.example.com/verify?email="+myEmail+"&token="+myToken+"&uid="+myUid;

            });

    }, function (error) {
       ...
    }); 

然后,在我的服务器上,我将拥有邮件、uid 和令牌。
所以,我的问题是:
如何验证令牌是否有效?不可能吗?
我知道令牌是加密的,但密钥是公开的......所以任何人都可以制作有效的令牌!
我的意思是,例如,我有一个过期的令牌,我可以对其进行解码、更改过期时间、再次对其进行编码并在不知道任何密码的情况下访问我的服务器

我有什么遗漏吗?

显然我无法通过 REST 验证令牌。
我有什么选择?

【问题讨论】:

  • 无需调用 Firebase 服务器来验证 ID 令牌。所有信息都在令牌本身中,并且可以使用服务凭证进行解码。见stackoverflow.com/questions/42084299/…stackoverflow.com/questions/37634305/…packagist.org/packages/firebase/php-jwt
  • 您阅读完整的问题了吗?
  • 显然不是。再说一遍:我提供的链接提供了您问题标题的确切答案,验证了 PHP 中的 JWT。如果您问为什么这是一种安全的方法,我建议您更新标题以反映这一点。这是一个有效的问题,与您的标题当前提出的问题不同。答案是顺便说一句,铸造 JWT 要求您有权访问项目的凭据。由于这些是私有的,因此只有有权访问它们的人才能铸造有效的令牌。
  • 我不知道“mint JWT”是什么......你的“项目凭证”是什么意思......我使用 Firebase 控制台......它在那里吗?
  • 有关如何使用第三方 JWT 库验证 Firebase ID 令牌的更多信息,请参阅 firebase.google.com/docs/auth/admin/…

标签: php rest authentication firebase firebase-authentication


【解决方案1】:

来自 Firebase Documentation

Firebase Admin SDK 具有用于验证和解码 ID 令牌的内置方法。 如果提供的 ID 令牌格式正确、未过期且签名正确,则该方法返回解码后的 ID 令牌。您可以从解码后的令牌中获取用户或设备的 uid。

因此,您无需担心有人试图生成假令牌。

在 PHP 中验证令牌,如文档 Firebase Admin SDK for PHP 中所述

验证令牌的最少代码:

use Kreait\Firebase;
use Firebase\Auth\Token\Exception\InvalidToken;

//create Firebase factory object
//$firebase = (new Firebase\Factory())->create();

//get a token from client 
//$idTokenString = 'eyJhbGciOiJSUzI1...';

try {
    $verifiedIdToken = $firebase->getAuth()->verifyIdToken($idTokenString);
} catch (InvalidToken $e) {
    echo $e->getMessage();
}

$uid = $verifiedIdToken->getClaim('sub');
$user = $firebase->getAuth()->getUser($uid);
echo $user; 

【讨论】:

  • 我重复我说过的话:“如果我发现一个过期的令牌,我可以对其进行解码,更改过期时间,再次对其进行编码,并在不知道任何密码的情况下访问我的服务器。”事实上,这就是我所做的,并且奏效了。所以我认为目前唯一的解决方案是生成我自己的令牌
  • 同样,您可以使用公钥解码令牌,但不能使用公钥对其进行编码。如果您使用公钥对其进行编码,则令牌验证将在您的服务器上失败。我认为它适用于您的情况,因为您同时拥有公钥和私钥。但是世界其他地方没有你的私钥。如果你仍然认为你能做到,那就给谷歌写一封电子邮件,你比他们聪明!
  • 调用未定义的方法 Kreait\Firebase::getTokenHandler()
  • 感谢您指出这一点,同时 API 已更新。我已经调整了我的代码。现在应该可以工作了!
猜你喜欢
  • 2022-08-16
  • 2015-03-03
  • 2023-01-12
  • 2020-07-31
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
相关资源
最近更新 更多