有没有办法从firebase身份验证中删除用户?

Sun*_*thi 0 php firebase-authentication firebase-realtime-database

我正在使用 Firebase Auth Rest API。我有用 PHP 编写的代码来将用户添加到数据库和 firebase 身份验证。我存储的信息是kind、idToken、email、refreshToken、expiresIn、localId。这一切都很棒!

现在,当我尝试从数据库中删除用户时,它工作正常,但不会从 firebase 身份验证中删除用户。请在下面找到用于注册和删除用户的代码。

我得到的错误是 CREDENTIALS_TOO_OLD_LOGIN_AGAIN(或)INVALID_ID_TOKEN。

FIREBASE_KEY 是我的 firebase 密钥,在 $data 我传递用户 idToken

/*
* User Sign Up
*/

function user_signup($data){
    $response = true;
    $data = json_encode($data);

    $url = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key=".FIREBASE_KEY;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    $jsonResponse = curl_exec($ch);
    if(curl_errno($ch))
    {
        $response = false;
    }
    curl_close($ch);
    return $jsonResponse;
}

/*
* User Delete
*/

/* function user_delete($data){
    $response = true;
    $data = json_encode($data);
    $url = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/deleteAccount?key=".FIREBASE_KEY;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    $jsonResponse = curl_exec($ch);

    if(curl_errno($ch))
    {
        $response = false;
    }
    curl_close($ch);

    return $jsonResponse;

} */
Run Code Online (Sandbox Code Playgroud)

jer*_*mez 5

与 Firebase REST API 交互的方式有两种:

  • 通过使用用户的 ID 令牌对您的请求进行身份验证,具有相同的权限和限制,就好像它们自己与您的应用程序交互一样
  • 通过使用服务帐户的凭据进行身份验证,您可以不受任何限制地完全访问您的应用程序。

要删除用户,您可以使用这两种方法,但是在使用用户的 ID 令牌时,您必须以用户身份进行身份验证(有效地模拟他们),然后才能代表该用户执行任何操作。

更好的解决方案是使用 Admin SDK 来执行该任务。如将 Firebase Admin SDK 添加到您的服务器 中所述,通过使用服务帐户凭据对您对 Firebase REST API 的请求进行身份验证,您将能够更轻松地执行管理任务(例如从身份验证数据库中删除用户)。

以下是开始使用基于服务帐户的身份验证的步骤:

  1. https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk上生成服务帐户凭据
  2. 使用 Google Auth Library for PHP 能够对 Google/Firebase API 进行身份验证调用https://github.com/googleapis/google-auth-library-php#call-the-apis
  3. 当你在 Auth 库的帮助下创建了一个 HTTP 客户端时,你可以调用这个 API 端点来删除用户
$client->post('https://www.googleapis.com/identitytoolkit/v3/relyingparty/deleteAccount', [
    'json' => [
        'localId' => 'uid-of-user-to-delete'
    ]
]);
Run Code Online (Sandbox Code Playgroud)

localId参数未记录在https://firebase.google.com/docs/reference/rest/auth/#section-delete-account 上,但它在官方管理 SDK 中使用并且有效。


使用 Admin SDK ( https://firebase.google.com/docs/admin/setup#initialize_the_sdk ) 将是执行此类管理任务的推荐方式。Node.js、Java、Python、Go 和 C# 都有官方 SDK - 我为 PHP 维护了一个非官方 SDK,你可以在https://github.com/kreait/firebase-php找到。有了它,您可以像这样执行相同的任务:

// kreait/firebase-php ^5.0
$factory = (new Factory)->withServiceAccount('service_account.json');
$auth = $factory->createAuth();

$auth->deleteUser('uid-of-user-to-delete');

// kreait/firebase-php ^4.0
$serviceAccount = ServiceAccount::fromJsonFile('service_account.json');
$firebase = (new Factory())
    ->withServiceAccount($serviceAccount)
    ->create();

$firebase->getAuth()->deleteUser('uid-of-user-to-delete');
Run Code Online (Sandbox Code Playgroud)

旁注:

我会考虑将用户的 ID 令牌存储在单独的数据库中存在安全风险:如果您的数据库遭到破坏,攻击者可以获得对您用户的 ID 令牌的访问权,并可以使用尚未过期的那些令牌来访问您的应用程序。

将用户从前端(Web、移动)传递到后端(服务器)的推荐流程是:

  1. 在您的前端使用 Firebase Client SDK,例如在您的 Web 应用程序中
  2. 让用户通过客户端 SDK 在前端登录 Firebase,当用户成功登录时,在您的客户端检索 ID 令牌,将其发送到您的后端并在您的后端验证 ID 令牌
  3. 一旦您验证了 ID 令牌,您就可以从 ID 令牌中提取用户的 Firebase ID 并将其保存到您的数据库中,例如在将您的本地用户 ID 映射到 Firebase 用户 ID 的表中,而无需存储他们的完整 ID 令牌(= 完整凭据)