2

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'

4

1 に答える 1

2

Firebase JWT には、ここにない構造があります。これらの認証トークンの内容についての詳細な説明は、 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 で返す数値です)。

于 2012-12-28T17:56:22.523 に答える