有什么方法可以从Firebase身份验证中删除用户?

时间:2019-03-24 18:02:34

标签: php firebase-realtime-database firebase-authentication

我正在使用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;

} */

1 个答案:

答案 0 :(得分:0)

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

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

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

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

以下是基于服务帐户的身份验证入门的步骤:

  1. https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk上生成服务帐户凭据
  2. 使用适用于PHP的Google身份验证库可以对Google / Firebase API https://github.com/googleapis/google-auth-library-php#call-the-apis
  3. 进行身份验证的调用
  4. 在Auth库的帮助下创建HTTP客户端后,您可以调用此API端点以删除用户
$client->post('https://www.googleapis.com/identitytoolkit/v3/relyingparty/deleteAccount', [
    'json' => [
        'localId' => 'uid-of-user-to-delete'
    ]
]);

https://firebase.google.com/docs/reference/rest/auth/#section-delete-account上没有记录localId参数,但可以在官方admin SDK中使用它并可以使用。


使用Admin SDK(https://firebase.google.com/docs/admin/setup#initialize_the_sdk)是执行此类管理任务的推荐方法。存在针对Node.js,Java,Python,Go和C#的官方SDK-我维护着一个非官方的PHP,您可以在https://github.com/kreait/firebase-php上找到它。有了它,您可以执行以下相同的任务:

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

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

附带说明:

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

将用户从您的前端(网络,移动)传递到后端(服务器)的建议流程是:

  1. 在前端中使用Firebase Client SDK,例如in your web application
  2. 让用户通过客户端SDK登录到前端的Firebase,并在用户成功登录retrieve the ID token on your client后将其发送到您的后端和verify the ID token on your backend
  3. 验证ID令牌后,您可以从ID令牌中提取用户的Firebase ID并将其保存到数据库中,例如在将您的本地用户ID映射到Firebase用户ID的表中,而无需存储其完整ID令牌(=完整凭据)