Я аутентифицирую своих пользователей на своем веб-сервисе, а затем создаю Пользовательский токен Firebase с помощью PHP-JWT:
// Requires: composer require firebase/php-jwt
use Firebase\JWT\JWT;
// Get your service account's email address and private key from the JSON key file
$service_account_email = ...;
$private_key = ...;
function create_custom_token($uid, $is_premium_account) {
global $service_account_email, $private_key;
$now_seconds = time();
$payload = array(
"iss" => $service_account_email,
"sub" => $service_account_email,
"aud" => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
"iat" => $now_seconds,
"exp" => $now_seconds+(60*60), // Maximum expiration time is one hour
"uid" => $uid,
"claims" => array(
"premium_account" => $is_premium_account
)
);
return JWT::encode($payload, $private_key, "RS256");
}
Но пользователи, которым я выполняю аутентификацию таким образом, не отображают удобные для администратора поля «Идентификатор» и «Поставщики» на панели «Аутентификация» в консоли Firebase:
Первые два — это пользователи, которых я аутентифицировал с помощью этого пользовательского процесса аутентификации, а последний — это пользователь, которого я аутентифицировал напрямую через Google.
Как заполнить поля «Идентификатор» и «Поставщики» для пользователей, созданных с помощью пользовательской аутентификации?
Столбец «Поставщики» будет отображаться только в том случае, если информация, прикрепленная к пользователю, соответствует одному или нескольким указанным поставщикам в разделе «Методы входа» (https://console.firebase.google.com/project/_/authentication/providers).
У пользовательских провайдеров нет четкого значка, и Firebase не будет знать, что отображать в столбце «Идентификатор» (UID уже находится в отдельном столбце в конце).
Тем не менее, вы делать иметь некоторый контроль над отображением столбцов, создавая их заранее (т.е. перед первым входом в систему) или обновляя информацию о пользователе после создания записи пользователя.
Я подготовил пример, показывающий, какая комбинация полей приводит к какому отображению:
Пожалуйста, обратите внимание:
Вы можете создавать и обновлять пользователей через API REST Firebase Auth, но я бы предложил использовать для этого один из официальных SDK Firebase Admin SDK — на случай, если вы захотите придерживаться PHP, я знаю неофициальный: kreait / firebase-PHP (Документация) (Отказ от ответственности: я поддерживаю PHP SDK :)).
На нетехническом примечании: я бы не стал слишком беспокоиться о списке пользователей в веб-консоли Firebase: используйте инструмент Firebase CLI или один из официальных (или неофициальных;)) Admin SDK, чтобы создать обзор, соответствующий вашим потребностям ,
В аннотации Bounty вы упомянули, что спросили об этом в Сообществе Firebase Slack без ответа — вы можете найти меня и других разработчиков PHP в канале #php. Я включил уведомления для канала, поэтому, пожалуйста, не стесняйтесь присоединиться, если у вас есть дополнительные вопросы.
К вашему сведению, это код, который я написал с помощью PHP SDK для создания данных для скриншота выше:
<?php
declare(strict_types=1);
use Kreait\Firebase;
use Kreait\Firebase\Util\JSON;
require_once __DIR__.'/vendor/autoload.php';
$serviceAccount = Firebase\ServiceAccount::fromJsonFile(__DIR__.'/service_account.json');
$firebase = (new Firebase\Factory())
->withServiceAccount($serviceAccount)
->create();
$auth = $firebase->getAuth();
// Remove all users
foreach ($auth->listUsers() as $user) {
$auth->deleteUser($user->uid);
}
// Simulate custom auth
$ct = $auth->createCustomToken('a-custom-auth');
$r = $auth->getApiClient()->exchangeCustomTokenForIdAndRefreshToken($ct);
echo JSON::prettyPrint($auth->getUser('a-custom-auth'));
echo JSON::prettyPrint($auth->createUser([
'uid' => 'displayname-only',
'displayName' => 'Jérôme Gamez',
]));
echo JSON::prettyPrint($auth->createUser([
'uid' => 'email-only',
'email' => '[email protected]',
]));
echo JSON::prettyPrint($auth->createUser([
'uid' => 'email-and-password',
'email' => '[email protected]',
'password' => 'password'
]));
echo JSON::prettyPrint($auth->createUser([
'uid' => 'phone-only',
'phoneNumber' => '+49-123-1234567',
]));
echo JSON::prettyPrint($auth->createUser([
'uid' => 'email+name+phone',
'email' => '[email protected]',
'displayName' => 'Jérôme Gamez',
'phoneNumber' => '+49-123-7654321',
]));
echo JSON::prettyPrint($auth->createUser([
'uid' => 'email+name+password+phone',
'email' => '[email protected]',
'displayName' => 'Jérôme Gamez',
'password' => 'example123',
'phoneNumber' => '+49-321-7654321',
]));
Других решений пока нет …