如何通过Rest API使用Firebase Auth Admin SDK?PHP多租户场景咨询
解决PHP后端调用Firebase Admin REST API的方案
嘿,我之前做SaaS项目时也碰到过几乎一模一样的困境,结合你的场景(GCP部署、服务账号全权限、自定义认证流程),给你几个实用的落地思路:
1. 优先升级kreait/firebase-php到最新版本
你提到维护者已经在GitHub Issue后补全了缺失的端点,这绝对是最省心的方案。直接执行更新命令:
composer update kreait/firebase-php
升级完成后,就能直接调用之前缺失的Admin功能了,比如:
$auth = $firebase->getAuth(); // 撤销用户的所有刷新令牌 $auth->revokeRefreshTokens($uid); // 禁用指定用户 $auth->disableUser($uid);
这种方式不用自己处理复杂的认证逻辑,直接复用成熟的SDK即可,能省不少事。
2. 用Google官方PHP客户端调用Firebase Admin REST API
如果SDK还是有覆盖不到的边缘场景,或者你更倾向于直接调用原生API,可以利用GCP服务账号的OAuth2凭证访问Firebase的Admin级API(这类API不对普通客户端开放,必须通过服务账号授权):
步骤1:获取服务账号的访问令牌
先安装Google官方的PHP客户端库:
composer require google/apiclient
然后编写代码生成访问令牌:
require __DIR__ . '/vendor/autoload.php'; $client = new Google\Client(); // 加载你的Firebase服务账号JSON文件 $client->setAuthConfig('/path/to/your-service-account.json'); // 添加Firebase Admin权限范围 $client->addScope('https://www.googleapis.com/auth/firebase'); // 用服务账号断言获取访问令牌 $client->fetchAccessTokenWithAssertion(); $accessToken = $client->getAccessToken()['access_token'];
如果你的服务器部署在GCP Compute Engine上,还能不用存储服务账号文件,直接从元数据服务器安全获取令牌:
$ch = curl_init('http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?scopes=https://www.googleapis.com/auth/firebase'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Metadata-Flavor: Google']); $response = curl_exec($ch); curl_close($ch); $tokenData = json_decode($response, true); $accessToken = $tokenData['access_token'];
步骤2:调用Firebase Admin REST端点
比如你需要撤销用户刷新令牌,对应的API端点是accounts:update,请求示例:
$firebaseProjectId = 'your-firebase-project-id'; $uid = 'target-user-uid'; $url = "https://identitytoolkit.googleapis.com/v1/accounts:update"; $data = [ 'localId' => $uid, 'revokeRefreshTokens' => true ]; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer {$accessToken}", "Content-Type: application/json", "X-Firebase-Project-Id: {$firebaseProjectId}" ]); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 处理响应结果 if ($httpCode === 200) { echo "刷新令牌已成功撤销"; } else { $error = json_decode($response, true); echo "操作失败:" . $error['error']['message']; }
禁用用户、修改密码等其他Admin操作,都可以通过对应的Identity Toolkit API端点实现,参数可以参考Google Identity Platform的官方文档。
3. 封装自定义PHP工具类
如果需要频繁调用多个Admin API,可以自己封装一个轻量级的工具类,把令牌获取和API调用的逻辑封装起来,方便项目中复用。比如创建一个FirebaseAdminClient类,内置revokeRefreshToken、disableUser等方法,内部统一处理认证和请求逻辑。
总结
- 优先用升级后的kreait/firebase-php,开发成本最低
- 自定义REST调用适合SDK覆盖不到的场景,依托GCP服务账号权限可以安全访问所有Admin功能
- GCP元数据服务器获取令牌的方式更安全,避免在服务器上存储敏感的服务账号文件
内容的提问来源于stack exchange,提问作者Lashae
相关产品推荐
相关产品推荐

