如何在 Firebase 自定义身份验证中填充 `identifier` 和 `providers`?
How to populate `identifier` and `providers` in Firebase custom authentication?
我正在我的网络服务上验证我的用户,然后创建 Firebase custom token via 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 控制台的 "Authentication" 面板中显示管理员友好的 "Identifier" 和 "Providers" 字段:
前两个是我通过这个自定义认证过程认证的用户,最后一个是我直接通过Google认证的用户。
如何为通过自定义身份验证创建的用户填充 "Identifier" 和 "Providers" 字段?
如果附加到用户的信息与“登录方法”部分 (https://console.firebase.google.com/project/_/authentication/providers) 中的一个或多个给定提供者匹配,“提供者”列将仅显示一个图标。
自定义提供程序没有明显的图标,Firebase 不知道在“标识符”列中显示什么(UID 已经在末尾的自己的列中)。
但是,您 可以通过提前创建列(意思是:在首次登录之前)或更新创建用户条目后的用户信息。
我准备了一个示例,显示哪种字段组合导致哪种显示:
请注意:
- 显示名称无效:如果它是唯一提供的数据,则用户被视为匿名。
- 电子邮件 + 密码与“Email/Password”提供商匹配
- Phone 号码将始终匹配“Phone”提供商
- 匹配的提供者的图标将显示在列中,即使提供者已被禁用。
- 电子邮件和 Phone 号码必须是唯一的。如果您的应用程序允许多个用户使用相同的电子邮件 address/phone 号码,如果您只想查看有关您的 Firebase 项目用户的更多信息,您就会遇到麻烦。
您可以通过 Firebase Auth REST API, but I would suggest to use one of the official Firebase Admin SDKs SDK to do it - in case you want to stick to PHP, I happen to know an unofficial one: kreait/firebase-php (Documentation) 创建和更新用户(免责声明:我是 PHP SDK 的维护者 :))。
关于非技术说明:我不会太在意 Firebase Web 控制台中的用户列表:使用 Firebase CLI 工具或官方(或非官方 ;) 之一的 Admin SDK 创建一个满足您需求的概览。
您在赏金注释中提到您在 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' => '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',
]));
我正在我的网络服务上验证我的用户,然后创建 Firebase custom token via 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 控制台的 "Authentication" 面板中显示管理员友好的 "Identifier" 和 "Providers" 字段:
前两个是我通过这个自定义认证过程认证的用户,最后一个是我直接通过Google认证的用户。
如何为通过自定义身份验证创建的用户填充 "Identifier" 和 "Providers" 字段?
如果附加到用户的信息与“登录方法”部分 (https://console.firebase.google.com/project/_/authentication/providers) 中的一个或多个给定提供者匹配,“提供者”列将仅显示一个图标。
自定义提供程序没有明显的图标,Firebase 不知道在“标识符”列中显示什么(UID 已经在末尾的自己的列中)。
但是,您 可以通过提前创建列(意思是:在首次登录之前)或更新创建用户条目后的用户信息。
我准备了一个示例,显示哪种字段组合导致哪种显示:
请注意:
- 显示名称无效:如果它是唯一提供的数据,则用户被视为匿名。
- 电子邮件 + 密码与“Email/Password”提供商匹配
- Phone 号码将始终匹配“Phone”提供商
- 匹配的提供者的图标将显示在列中,即使提供者已被禁用。
- 电子邮件和 Phone 号码必须是唯一的。如果您的应用程序允许多个用户使用相同的电子邮件 address/phone 号码,如果您只想查看有关您的 Firebase 项目用户的更多信息,您就会遇到麻烦。
您可以通过 Firebase Auth REST API, but I would suggest to use one of the official Firebase Admin SDKs SDK to do it - in case you want to stick to PHP, I happen to know an unofficial one: kreait/firebase-php (Documentation) 创建和更新用户(免责声明:我是 PHP SDK 的维护者 :))。
关于非技术说明:我不会太在意 Firebase Web 控制台中的用户列表:使用 Firebase CLI 工具或官方(或非官方 ;) 之一的 Admin SDK 创建一个满足您需求的概览。
您在赏金注释中提到您在 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' => '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',
]));