Firebase通过REST API PHP CURL获取数据

时间:2012-12-28 17:29:43

标签: api rest firebase

尝试通过PHP cURL进行简单的读取。如果我的安全规则允许每个人进入,那么我可以成功读取我的数据。

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

但是,如果我限制对特定用户名的读/写,例如

{
  "rules": {
    ".read": "auth.username == 'admin'",
    ".write": "auth.username == 'admin'"
  }
}

我被许可拒绝了。

代码如下......

require('JWT.php');
$secret = 'MY_FIREBASE_SECRET';
$data = array('username' => 'admin');
$token = JWT::encode($data, $secret);

$url = "https://MY_FIREBASE.firebaseio.com/messages.json?auth=$token";
$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => $url
));
$response = curl_exec($curl);

值得注意的是,如果我只使用我的FB秘密而不是URL中的令牌,我能够成功读取数据(auth = $ secret)。我还成功测试了使用“自定义身份验证”在Forge模拟器中读取数据,例如{'username':'admin'}

我正在使用PHP JWT库:https://github.com/luciferous/jwt/blob/master/JWT.php

由于我的cURL调用不正确或我没有正确构建令牌,因此不确定我是否获得了权限被拒绝。我尝试过使用POST和GET通过cURL,但我得到了相同的结果。

任何建议都会受到赞赏......


感谢Andrew的超快反应。我试过你的建议。不幸的是,我仍然得到'许可被拒绝'。这是我更新的代码......

require('JWT.php');
$secret = 'my-secret';
$user = array( 'v' => 0, 'iat' => time(), 'd' => array('username' => 'admin', 'type' => 'admin', 'fullname' => 'Administrator'));
$token = JWT::encode($user, $secret);
$curl = curl_init();
$url = "https://myfirebase.firebaseio.com/messages.json?auth=$token";
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => $url
));
$response = curl_exec($curl);
curl_close($curl);
  • 我确实通过将数据的.read规则更改为 “auth!= null” - 但这似乎并不安全......

作为参考,我们的数据结构只是

+ myfirebase
            + messages
                       - 000001 = "this is the 1st test message"
                       - 000002 = "this is the 2nd test message"

BTW:我们的应用程序只有1个用户读/写数据。如果我无法使令牌工作......有没有更好的方法通过REST API验证调用,而无需在URL中传递我们的密钥?例如&安培; AUTH = '我的秘密'

1 个答案:

答案 0 :(得分:2)

Firebase JWT有一些缺少的结构。这里有一个详细解释这些auth令牌应该是什么: https://www.firebase.com/docs/security/jwt-auth-token-format.html

这是一个具有适当结构的片段。

require_once('JWT.php');

$fbSecret = 'your-secret';
$user = array( 'v' => 0, 'iat' => <timestamp>, 
  'd' => array('username' => 'jimbob', 'type' => 'admin',\
    'fullname' => 'Jim Bob')
  );
$token = JWT::encode($user, $fbSecret);

请注意,“d”字段包含实际有效负载。 “v”和“iat”也是必需的。 “iat”应该是自纪元以来的秒数(它是(新的Date())。getTime()在Javascript中返回的数字。)