Я не могу заставить свои правила базы данных работать, когда они требуют аутентификации.
Пользователь входит в систему с использованием JavaScript, а затем база данных обновляется с помощью запроса PHP / REST с использованием firebase-PHP.
PHP:
$firebase = new \Firebase\FirebaseLib('https://AppNameGoesHere.firebaseio.com/');
$data = array(
'field1' => $response_array['field1'],
'field2' => $response_array['field2'],
'field3' => $response_array['field3']
);
$firebase->set('users/' . $response_array['userID'], $data)
$response_array
это массив из формы HTML. $response_array['userID']
пользовательский идентификатор Firebase.
Эти правила работают (без аутентификации):
{
"rules": {
"users": {
"$uid": {
".read": true,
".write": true
}
}
}
}
Они, с аутентификацией, не работают:
{
"rules": {
"users": {
"$uid": {
".read": "auth.uid === $uid",
".write": "auth.uid === $uid"}
}
}
}
Ошибка:
{ "error" : "Permission denied" }
Какие-либо предложения?
Как Фрэнк упомянул в комментариях, вы должны позвонить setToken()
для аутентификации всех последующих операций чтения / записи в базу данных. Чтобы получить этот токен из клиентского JavaScript и передать его в конечную точку PHP, вы должны использовать getIdToken вот так:
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
// Send token to your PHP backend via HTTPS
// ...
}).catch(function(error) {
// Handle error
});
С этим idToken
значение, похоже, что вы можете передать это firebase-php
библиотеки setToken
функция:
...
$firebase->setToken(idToken)
$firebase->set('users/' . $response_array['userID'], $data)
Пока $response_array['userID']
совпадает с UID того, кто делает этот запрос, вы больше не должны получать Permission denied
ошибка.
Других решений пока нет …