尝试通过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);
作为参考,我们的数据结构只是
+ myfirebase
+ messages
- 000001 = "this is the 1st test message"
- 000002 = "this is the 2nd test message"
BTW:我们的应用程序只有1个用户读/写数据。如果我无法使令牌工作......有没有更好的方法通过REST API验证调用,而无需在URL中传递我们的密钥?例如&安培; AUTH = '我的秘密'
答案 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中返回的数字。)