Запрос хранилища Firestore на имя пользователя приложения (PHP) - PullRequest
2 голосов
/ 29 сентября 2019

Я хотел бы аутентифицировать пользователя нашего приложения по Firebase / Firestore, а затем сделать запрос к хранилищу как этот пользователь (т.е. не как учетная запись службы).

Я знаю два метода для аутентификации:

Простой HTTP-запрос

$client = new GuzzleHttp\Client();
$responee = $client->request(
  'POST',
  'https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=' . $key,
  [
    'headers' => [
      'content-type' => 'application/json',
      'Accept' => 'application/json'
    ],
    'body' => json_encode([
      'email' => $email,
      'password' => $password,
      'returnSecureToken' => true
    ]),
    'exceptions' => false
  ]
);

Kreait SDK

$userRecord = $auth->verifyPassword($email, $password);

Что я не знаю , как использовать эту информацию для созданиязапрос к хранилищу.

Google Cloud Firestore SDK

StorageClient принимает ключ конфигурации credentialsFetcher, но я не знаю, как его использовать.Он принимает любой объект, который реализует FetchAuthTokenInterface.Я играл с теми, которые существуют, даже пытался реализовать свой собственный, который просто передает idToken из метода Simple HTTP Request .Не повезло.

$credentialsFetcher = new myFetchAuthTokenImplementation($idToken);

$storage = new StorageClient([
  'credentialsFetcher' => $credentialsFetcher,
]);
$bucket = $storage->bucket('my_bucket');
$object = $bucket->object('file_backup.txt');

print $object->downloadAsString();
use Google\Auth\FetchAuthTokenInterface;

class myFetchAuthTokenImplementation implements FetchAuthTokenInterface
{
  private $token;

  public function __construct(string $token)
  {
    $this->token = [
      'access_token' => $token,
    ];
  }

  public function fetchAuthToken(callable $httpHandler = null)
  {
    return $this->token;
  }

  public function getCacheKey()
  {
    return null;
  }

  public function getLastReceivedToken()
  {
    return $this->token;
  }
}

Kreait SDK

Кажется, он может получать информацию из хранилища, но только с использованием учетной записи службы.Не мой пользователь приложения.

$firebaseFactory = (new Factory)->withServiceAccount(__DIR__.'/google-service-account.json');
$storage = $firebaseFactory->createStorage();
$imageUrl = $storage->getBucket()
    ->object('file_backup.txt')

Мне нужно повторно инициализировать $firebaseFactory с записью пользователя приложения, что-то вроде этого вымышленного метода $firebaseFactory = (new Factory)->withApplicationUser($userRecord);

Хотя я бы хотелиспользуйте какой-нибудь SDK, подойдет любое решение, даже с простыми HTTP-запросами.

Возможно, я смогу реализовать это с помощью Google JavaScript SDK, но я бы хотел придерживаться PHP.

Ваша помощь очень ценится.

1 Ответ

1 голос
/ 29 сентября 2019

Насколько я знаю, Kreait PHP SDK упаковывает REST API Google Cloud Storage.Если это так, он всегда получает доступ к Хранилищу с административными учетными данными, и нет никакого способа получить к нему доступ как к учетной записи пользователя для проверки подлинности Firebase, а также для обеспечения соблюдения правил безопасности для конкретного пользователя.

Чтобы получить доступ к облачному хранилищу какПользователь Firebase Authentication, вы должны будете аутентифицировать клиентскую сторону и передать полученный ID-токен в SDK / API, который обеспечивает соблюдение правил безопасности Firebase для определенных пользователей.Это означает, что вам придется использовать один из клиентских SDK Firebase для доступа к облачному хранилищу, поскольку в настоящее время нет общедоступного REST API, предоставляющего эту функцию.

...