【问题标题】:Firebase GET data via REST API PHP CURLFirebase 通过 REST API PHP CURL 获取数据
【发布时间】:2014-03-24 07:54:58
【问题描述】:

尝试通过 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 模拟器中读取数据,例如{'用户名':'管理员'}

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

不确定我是否因为我的 cURL 调用不正确或者我没有正确构建令牌而被拒绝许可。我曾尝试通过 cURL 使用 POST 和 GET,但我得到了相同的结果。

任何建议将不胜感激......


感谢安德鲁的超快速反应。我试过你的建议。不幸的是,我仍然收到“权限被拒绝”。这是我更新的代码...

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"

顺便说一句:我们的应用程序将只有 1 个用户读取/写入数据。如果我无法让令牌工作......有没有更好的方法来通过 REST API 对调用进行身份验证,而无需在 URL 中传递我们的密钥?例如&auth='我的秘密'

【问题讨论】:

    标签: api rest firebase


    【解决方案1】:

    Firebase JWT 有一些此处缺少的结构。此处详细说明了这些身份验证令牌中应包含的内容: https://www.firebase.com/docs/security/jwt-auth-token-format.html

    这是一个具有适当结构的 sn-p。

    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”应该是自纪元以来的秒数(它是 (new Date()).getTime() 在 Javascript 中返回的数字)。

    【讨论】:

      猜你喜欢
      • 2015-11-17
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      相关资源
      最近更新 更多