Firebase .on不使用身份验证

时间:2014-05-29 20:21:14

标签: php firebase firebase-security jwt

更新

我至少可以使用firebase-simple-login.jsauth.login('anonymous')获取客户端代码以使用身份验证。服务器端(即“写”)仍然无效。

原始问题

我正在创建一个使用Firebase集成的应用,只需要保护我的Firebase数据。如果您知道我的Firebase网址以及没有任何身份验证的位置,那么能够删除所有内容显然不太理想。

我不是要尝试记录我的用户(或者至少不是传统意义上的用户),我只是想确保在从Firebase数据读取和写入时有一些SORT认证。我已经花了好几个小时,似乎无法使它工作(这么多“简单”)。

首先,我的Firebase安全规则 - 简单

{
    "rules": {
      ".read" : "auth != null",
      ".write": "auth != null"
    }
}

我从服务器端代码推送到Firebase并读取结果客户端。这是一个简单的轮询应用 - 民意调查响应按以下格式推送到Firebase:clients\ClientA\polls\POLLID(random)\RandomDataID(from Firebase)\Response Data。我正在使用firebase/php-jwt生成我的服务器端JWT:

    <?php

class generateFirebaseToken {
    public static function generate(array $data = array())
    {
        $key = 'FIREBASE SECRET KEY';
        $token = array(
            'iss' => 'https://example.com',
            'iat' => time()
        );
        // Add additional data to token
        $token = array_merge($token, $data);
        $jwt = JWT::encode($token, $key);

        return $jwt;
    }
}

然后我使用以下代码将数据推送到Firebase。包含用户会话的几个变量。这使用我编写的类来为Firebase准备CURL请求。如果我从Firebase规则中删除auth != null,一切正常。否则,不要':

$fbData = array(
            'name' => "{$this->user->first_name} {$this->user->last_name}",
            'answer' => $fbAnswer,
            'gravatar' => Gravatar::src($this->user->email)
        );
        $token = generateFirebaseToken::generate();
        $fb = new fireBase("clients/{$this->client->nickname}/polls/{$poll->uniquid}.json?auth=$token", $fbData);
        $fb->execute('POST');

$ fb-&gt; execute()

的来源
public function execute($method)
    {
        $data_string = json_encode($this->data);

        $ch = curl_init($this->root . $this->path); // http://myapp.firebaseio.com/
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json',
                'Content-Length: ' . strlen($data_string))
        );

        $result = curl_exec($ch);
        return $result;
    }

客户端也不起作用。我通过对服务器端代码执行$.getJSON请求并将其传递给Firebase来检索JWT。它似乎正确验证但我收到错误FIREBASE WARNING: on() or once() for /clients/exampleclient/polls/FdV4RM9LHcoB7U7W failed: Error: permission_denied: Client doesn't have permission to access the desired data.。这是客户端代码:

    $.getJSON('/secure/jwt-token', function(json) {
        jwtToken = json.token;
        launchFirebase(jwtToken);
    });
function launchFirebase(token)
{
    var fb = new Firebase('https://myapp.firebaseio.com/clients/exampleclient/polls/' + pollID);
    fb.auth(token, function(e) {
        if(e) {
            alert('Authentication error : ' + e);
        } else {
            alert('Authenticated'); // Alert shows, so I assume authenticated
            fb.on('child_added', function(snapshot) {
                // do stuff
                // Error occurs here.
            });
        }
    });
}

我假设我在这里缺少一些简单的东西,也许我不明白如何使用JWT ..无论如何,任何帮助都将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

HOURS 浪费了精力,但我终于找到了问题,希望这有助于其他新手使用Firebase。同样表明,如果你在同一个问题上工作几个小时,请休息一下,雾就会开始清除。

好的,问题当然是 - 很简单。我正在使用firebase/php-jwt库。我没有把所有事情都包括在内,因为我没有将'd'添加到令牌数据数组中 - 这就是auth来自哪里。因此,我的安全规则正在检查auth,因为我没有将d添加到我的令牌中而丢失。

这是固定代码:

$key = 'YOUR-SECURITY-KEY';
        $token = array(
            'iss' => 'https://EXAMPLE.com',
            'iat' => time(),
            'd' => array(
                'foo' => 'bar' // THIS GIVES YOU THE AUTH VARIABLE!!!!!
            )
        );
        // Add additional data to token
        $token = array_merge($token, $data);
        $jwt = JWT::encode($token, $key);

        return $jwt;

如果您为人们编写插入服务的代码,就像在这种情况下一样,请提供更好的文档。似乎经常会完全省略这些事情,也许是因为开发人员应该只知道内在的东西?我终于找到了解读文档的答案,没有使用辅助库(就像这个一样)而制作一个令牌。