2012-12-28 162 views
2

试图通过PHP cURL进行简单读取。如果我的安全规则让每个人都参与进来,我可以成功地读取数据Firebase通过REST API获取数据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 = $秘密)。我还成功测试了使用“自定义认证”(例如, {“用户名”:“管理员”}

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

不知道如果我得到许可被拒绝,因为我的电话卷曲是不正确的,或者说我的构建令牌正确。我已经尝试使用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" 

BTW:我们的应用程序只有1个用户读/写数据。如果我无法让令牌工作......有没有更好的方法来通过REST API对呼叫进行认证,而无需在URL中传递我们的密钥?例如& auth ='我的秘密'

回答

2

Firebase智威汤逊有一些结构,它在这里是缺少的。这里详细解释了这些认证令牌应该在哪里: 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”应该是自纪元以来的秒数(它是(new Date())。getTime()以Javascript返回的数字)。