2012-12-28 214 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返回的數字)。