Аутентификация Firebase PHP CURL

В настоящее время я создаю небольшой чат, используя Firebase и PHP. Я подумал, что это будет хороший обучающий проект для Firebase, и пока я им очень доволен!

Однако я наткнулся на стену. Я не уверен, как реализовать систему аутентификации в Firebase через PHP. Это довольно конкретно, что мне нужно, чтобы система аутентификации делала:

Чтобы иметь возможность использовать чат, пользователь должен войти в систему, используя мою пользовательскую систему входа в систему php. Затем, как только они войдут в систему, они также аутентифицируются, чтобы иметь возможность читать/писать в чате.

Я не мог понять, как это (если даже) возможно с PHP, используя CURL.

В моей функции __construct есть следующее:

require('/libs/FirebaseLib.php');
$this->firebase = new fireBase('https://<url>.firebaseio.com');

require('/libs/JWT.php');
require('/libs/FirebaseToken.php');
$tokenGen = new Services_FirebaseTokenGenerator('<firebase-secret>');
$this->authtoken = $tokenGen->createToken(
    array(
        'id' => $this->userid
    )
);

Как мне аутентифицироваться с помощью Firebase, чтобы пользователь мог читать/писать в моем чате и не разрешать неаутентифицированному пользователю читать/писать? Примечание. Я ничего не делал с правилами безопасности Firebase — это часть моего вопроса.

Я просмотрел документацию, может быть, я просто очень толстый, но я не мог найти то, что искал.

Надеюсь, кто-нибудь укажет мне в правильном направлении.

Спасибо!

РЕДАКТИРОВАТЬ: я намеренно не использовал javascript для своего чата, за исключением ajax-вызовов моего php-скрипта, который затем передает его в Firebase после того, как я сделал то, что хочу, с сообщениями пользователя.

EDIT 2: добавлены ссылки на используемые библиотеки: "Firebase Token Генератор" и "Клиент Firebase PHP"

EDIT 3: Мой текущий код выглядит так: (ссылка)

__construct:

$this->authtoken = JWT::encode(
    array(
        'admin' => true,
        'debug' => true,
        'v' => 0,
        'iat' => time(),
        'd' => array('user' => 'admin')
    ),
    '<secret>',
    'HS256'
);

Функция нового сообщения:

$response = $this->firebase->set('/chat.json?auth=' . $this->authtoken, array(
    'message' => array(
        'username' => 'Test',
        'time' => time(),
        'string' => 'Hello World!'
    )
));

Однако он возвращает: { "error" : "invalid_token: Could not parse auth token." }. Я в основном хочу получить разрешение как администратор. Я пытался просто использовать секрет Firebase в качестве аутентификации, но он возвращает ту же ошибку.

Правила:

{
  "rules": {
    ".read": "auth.username == 'admin'",
    ".write": "auth.username == 'admin'"
  }
}

person MrE    schedule 11.04.2013    source источник


Ответы (1)


Общий рабочий процесс будет таким:

  1. После того, как пользователь прошел аутентификацию с помощью вашей пользовательской системы входа в систему, сгенерируйте токен аутентификации Firebase в PHP-коде на стороне сервера. (похоже, вы зашли так далеко с вставленным фрагментом кода).
  2. Передайте этот токен обратно клиенту.
  3. Попросите клиента вызвать firebase.auth(‹token›); для аутентификации в Firebase с помощью созданного сервером токена.
  4. Используйте правила безопасности, чтобы ограничить то, что клиент может читать/писать, в зависимости от содержимого его токена аутентификации.

Для простого сценария, когда вы просто хотите разрешить всем доступ к Firebase, если они аутентифицированы, вы можете просто использовать такие правила безопасности, как:

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

Это даст аутентифицированным пользователям доступ для чтения/записи ко всей вашей Firebase. Вы, вероятно, захотите заблокировать его еще больше (т.е. предоставить им доступ только для чтения/записи к определенным частям Firebase). Ознакомьтесь с нашим Кратким руководством по безопасности, чтобы узнать, как работают правила аутентификации и безопасности.

Если это не поможет, возможно, вы можете уточнить, в какой части вы запутались.

person Michael Lehenbauer    schedule 11.04.2013
comment
Спасибо, Майкл, я почти понял - как сделать firebase.auh(‹token›); с помощью php/curl? Я вижу, что это можно сделать с помощью JS, но возможно ли это с помощью PHP/Curl? - person MrE; 11.04.2013
comment
Или я вас неправильно понял, и что мне нужно сделать, это запустить аутентификацию через JS? - person MrE; 11.04.2013
comment
Вы вообще используете firebase.js? Когда вы сказали «чат», я предположил, что это что-то вроде нашего примера с чатом (firebase.com/tutorial/ #example/chat), но, может быть, вы делаете что-то другое? Если вместо этого вы используете REST API от клиента (т. е. выполняете ajax GET/PUT), вы все равно можете использовать токен аутентификации, но вместо вызова firebase.auth() вам нужно добавить ?auth=‹token › к вашим запросам REST. - person Michael Lehenbauer; 11.04.2013
comment
Извините, да, я действительно пытаюсь использовать REST API. Я обновлю свой OP через 1 минуту с дополнительной информацией - person MrE; 11.04.2013
comment
ОП обновлен. Спасибо, Майкл, ваша помощь до сих пор была действительно полезной, и я очень ценю это! - person MrE; 11.04.2013
comment
Похоже, это проблема с клиентом firebase-php. Он автоматически добавляет .json в конец URL-адреса, который с вашим кодом приводит к добавлению .json в конец токена аутентификации, что делает его недействительным. Я открыл вопрос, чтобы предположить, что firebase-php должен поддерживать аутентификацию. github.com/ktamas77/firebase-php/issues/1 На данный момент вам нужно либо сделать запросы REST напрямую, либо изменить firebase-php. - person Michael Lehenbauer; 11.04.2013
comment
Большое спасибо, Михаил, покажу. Очень ценю помощь. Отмечу это как лучший ответ :). Протестировано с моими исправлениями в библиотеке, и это работает. - person MrE; 11.04.2013