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);
URL でトークンの代わりに FB シークレットを使用するだけで、データ (auth=$secret) を正常に読み取ることができます。また、「カスタム認証」を使用して Forge シミュレーターでデータを読み取るテストにも成功しました (例: {'username': 'admin'})。
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 人だけです。トークンを取得できない場合... URL で秘密鍵を渡すことなく、REST API 経由で呼び出しを認証するより良い方法はありますか? 例 &auth='my-secret'