更新
我至少可以使用firebase-simple-login.js
和auth.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 ..无论如何,任何帮助都将不胜感激。谢谢!
答案 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;
如果您为人们编写插入服务的代码,就像在这种情况下一样,请提供更好的文档。似乎经常会完全省略这些事情,也许是因为开发人员应该只知道内在的东西?我终于找到了解读文档的答案,没有使用辅助库(就像这个一样)而制作一个令牌。