Как заполнить `идентификатор` и` провайдеры` в пользовательской аутентификации Firebase? - PullRequest
0 голосов
/ 18 мая 2018

Я аутентифицирую своих пользователей в своем веб-сервисе, а затем создаю Пользовательский токен 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:

enter image description here

Первые два - это пользователи, которых я аутентифицировал с помощью этого пользовательского процесса аутентификации, а последний - это пользователь, которого я аутентифицировал напрямую через Google.

Как я могу заполнить поля «Идентификатор» и «Поставщики»для пользователей, созданных с помощью пользовательской аутентификации?

1 Ответ

0 голосов
/ 27 мая 2018

В столбце «Поставщики» отображается значок, только если информация, прикрепленная к пользователю, соответствует одному или нескольким указанным поставщикам в разделе «Методы входа» (https://console.firebase.google.com/project/_/authentication/providers).

У пользовательских провайдеров нет четкого значка, и Firebase не будет знать, что отображать в столбце «Идентификатор» (UID уже находится в отдельном столбце в конце).

Однако вы do могут управлять отображением столбцов, создавая их заранее (т.е. перед первым входом в систему) или обновляя информацию о пользователе после создания записи пользователя.

Я подготовил пример, показывающий, какая комбинация полей приводит к отображению:

enter image description here

Обратите внимание:

  • Отображаемое имя не оказывает никакого влияния: если это единственные предоставленные данные, пользователь считается анонимным.
  • Адрес электронной почты + пароль соответствуют поставщику "Электронная почта / пароль"
  • Номера телефонов всегда будут соответствовать"Телефон" провайдер
  • Значки для соответствующего провайдера будут отображаться в столбце, даже если провайдер был отключен.
  • Электронные письма и номера телефонов должны быть уникальными.Если ваше приложение позволяет нескольким пользователям с одним и тем же адресом электронной почты / номером телефона, у вас возникнут проблемы, если вы просто захотите увидеть больше информации о пользователях вашего проекта Firebase.

Вы можете создавать иобновите пользователей с помощью Firebase Auth REST API , но я бы предложил использовать для этого один из официальных SDK Firebase Admin SDK - на случай, если вы захотите придерживаться PHP, я знаю неофициальный: kreait / firebase-php ( Документация ) (Отказ от ответственности: я поддерживаю PHP SDK :)).

На нетехническом замечании: Iне будет слишком беспокоиться о списке пользователей в веб-консоли Firebase: используйте инструмент Firebase CLI или один из официальных (или неофициальных;)) Admin SDK, чтобы создать обзор, соответствующий вашим потребностям.

YouВ аннотации Bounty упоминается, что вы задали этот вопрос в сообществе Firebase Slack без ответа - вы можете найти меня и других разработчиков PHP в канале #php.Я включил уведомления для канала, поэтому присоединяйтесь к нам, если у вас есть дополнительные вопросы.

Обновление 2019-07-25 : в SDK теперь есть выделенное Discord Community на https://discord.gg/nbgVfty


К вашему сведению, это код, который я написал с помощью 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' => 'jerome@example.org',
]));

echo JSON::prettyPrint($auth->createUser([
    'uid' => 'email-and-password',
    'email' => 'jerome@example.com',
    'password' => 'password'
]));

echo JSON::prettyPrint($auth->createUser([
    'uid' => 'phone-only',
    'phoneNumber' => '+49-123-1234567',
]));

echo JSON::prettyPrint($auth->createUser([
    'uid' => 'email+name+phone',
    'email' => 'jerome@example.net',
    'displayName' => 'Jérôme Gamez',
    'phoneNumber' => '+49-123-7654321',
]));

echo JSON::prettyPrint($auth->createUser([
    'uid' => 'email+name+password+phone',
    'email' => 'jerome@example.de',
    'displayName' => 'Jérôme Gamez',
    'password' => 'example123',
    'phoneNumber' => '+49-321-7654321',
]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...