Php Firebase。关于不使用身份验证
更新 我至少能够使用Php Firebase。关于不使用身份验证,php,firebase,firebase-security,jwt,Php,Firebase,Firebase Security,Jwt,更新 我至少能够使用firebase simple login.js和auth.login('anonymous')让客户端代码与身份验证一起工作。服务器端(即“写入”)仍然无法工作 原始问题 我正在创建一个与Firebase集成的应用程序,只需保护我的Firebase数据。如果您知道我的Firebase URL,并且不需要任何身份验证就可以删除所有内容,这显然不太理想 我并不是想让我的用户登录(或者至少不是传统意义上的登录),我只是想确保在我读写Firebase数据时进行某种身份验证。我花了几
firebase simple login.js
和auth.login('anonymous')
让客户端代码与身份验证一起工作。服务器端(即“写入”)仍然无法工作
原始问题
我正在创建一个与Firebase集成的应用程序,只需保护我的Firebase数据。如果您知道我的Firebase URL,并且不需要任何身份验证就可以删除所有内容,这显然不太理想
我并不是想让我的用户登录(或者至少不是传统意义上的登录),我只是想确保在我读写Firebase数据时进行某种身份验证。我花了几个小时在这上面,似乎无法使它工作(这么多的“容易”)
首先,我的Firebase安全规则-简单
{
"rules": {
".read" : "auth != null",
".write": "auth != null"
}
}
我正在从服务器端代码推送到Firebase,并在客户端读取结果。这是一个简单的轮询应用程序-轮询响应按以下格式推送到Firebase:客户端\ClientA\polls\POLLID(random)\RandomDataID(来自Firebase)\Response数据
。我正在使用生成我的服务器端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;
}
}
$fb->execute()的来源
客户端也不工作。我通过对服务器端代码执行$.getJSON
请求来检索JWT,并将其传递给Firebase。它似乎进行了正确的身份验证,但随后我收到/clients/exampleclient/polls/FdV4RM9LHcoB7U7W的错误FIREBASE警告:on()或once():错误:权限\u拒绝:客户端没有访问所需数据的权限。
。以下是客户端代码:
$.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。。无论是什么情况,我们都将不胜感激。谢谢 浪费了数小时的精力,但我终于找到了问题所在,希望这能帮助其他刚刚使用Firebase的人。这也表明,如果你在同一个问题上工作了几个小时,休息一下,雾就会开始消散 好吧,问题当然很简单。我使用的是
firebase/phpjwt
库。我一切正常,除了我没有将'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;
如果您编写代码供人们插入服务,如本例所示,请提供更好的文档。这类事情似乎常常被完全忽略,也许是因为开发人员应该从本质上知道?我最终在阅读文档时发现了答案,即在不使用帮助程序库的情况下创建令牌(如下图所示)。在使用Firebase SDK时,如果尝试在auth中创建没有任何内容的令牌,则会抛出错误。通过使用PHP的JWT,您基本上绕过了这里的检查。考虑到您正在创建一个没有助手库的令牌,并且它显示了创建一个没有助手库的令牌的文档,我对您应该如何记录这一点感到有点困惑?很抱歉,但在我看来,我使用的是助手库。当您单击Helper Libraries下的PHP时,它将转到firebase/PHP jwt。因此,假设这是一个助手库是可以理解的。
$.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.
});
}
});
}
$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;