加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

使用PHP进行身份验证的Firebase REST访问

发布时间:2020-12-13 17:00:51 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试使用 PHP,Google Auth library以及Firebase的REST的 wrapper从服务器访问Firebase …这很有助于实现这一点: use FirebaseJWTJWT;use GoogleAuthCredentialsServiceAccountCredentials;use GoogleAuthHttpHandlerHttpHandlerFactory;use G
我正在尝试使用 PHP,Google Auth library以及Firebase的REST的 wrapper从服务器访问Firebase …这很有助于实现这一点:

use FirebaseJWTJWT;
use GoogleAuthCredentialsServiceAccountCredentials;
use GoogleAuthHttpHandlerHttpHandlerFactory;
use GuzzleHttpClient;

$email = 'account@email.com';
$key = 'private_key_goes_here';

$scopes = [
    'https://www.googleapis.com/auth/userinfo.email','https://www.googleapis.com/auth/firebase.database',];

$creds = [
    'client_email' => $email,'private_key' => $key,];

$serviceAccount = new ServiceAccountCredentials($scopes,$creds);
$handler = HttpHandlerFactory::build(new Client());
$token = $serviceAccount->fetchAuthToken($handler);

$firebase = new FirebaseFirebaseLib($url,$token);
$value = $firebase->get('test/hello');
# $value now stores "world"

但是,这需要Firebase中的安全规则是通用读/写,这是我不想要的.如果我将安全规则更新为:

{
  "rules": {
    "test": {
      ".read": "auth != null"
    }
  }
}

$value的结果变为{“error”:“Permission denied”}.我进行了广泛的搜索,并尝试了许多排列和可能的解决方案,没有确定的结果.

我已经使用this code向最终客户端提供JWT令牌,这些客户端可以成功使用它们并且可以毫无问题地利用安全规则.我最初为服务器尝试了相同的方法,但没有成功.我选择尝试将两种方法结合起来:

# Snipping code that didn't change...
$serviceAccount = new ServiceAccountCredentials($scopes,$creds);
$handler = HttpHandlerFactory::build(new Client());

$payload = [
    'iss' => $email,'sub' => $email,'aud' => 'https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit','iat' => time(),'exp' => time() + 60 * 60,'uid' => '123','claims' => [
        'uid' => '123',],];

$payload = $serviceAccount->updateMetadata($payload);
$token = JWT::encode($payload,$key,'RS256');

$firebase = new FirebaseFirebaseLib($url,$token);
$value = $firebase->get('test/hello');

这似乎接近了,但$value现在包含{“error”:“在auth标题中缺少声明’孩子’.”}.为了解决这个问题,我修改了编码调用:

$token = JWT::encode($payload,'RS256','key_id_goes_here');

这导致了一个稍微不同的错误:在auth标题中无效声明’kid’,表明我在正确的轨道上…但不完全在那里.直接使用JWT令牌会产生完全相同的结果.我有什么想法我做错了吗?电子邮件,私钥和密钥ID都直接来自我创建服务帐户时提供的json凭证文件.

我查看了几十页的文档和帖子,以下是最有帮助的:

> Using JWT for Server Auth (Firebase Docs)
> Using Custom Tokens to make REST requests to FB DB as an admin
> Is it still possible to do server side verification of tokens in Firebase 3?

Cross发布到Firebase Google Group.

解决方法

使用将成为安全规则中的auth变量的服务帐户进行身份验证时,可以指定auth_variable_override查询参数.它应该是一个正确转义的JSON对象.例如要做{“uid”:123}你要添加:

?auth_variable_override=%7B%22uid%22%3A%22123%22%7D

到请求URL的末尾.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读