Я хотел бы аутентифицировать пользователя нашего приложения по 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.
Ваша помощь очень ценится.