【问题标题】:Is there any way to delete the user from the firebase authentication?有没有办法从firebase身份验证中删除用户?
【发布时间】:2019-08-15 01:08:32
【问题描述】:

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

} */

【问题讨论】:

  • 要能够删除用户的帐户,用户必须最近通过身份验证。错误消息似乎表明情况并非如此。在这种情况下,解决方案是重新验证用户身份,然后尝试再次删除他们的帐户。
  • 感谢您的评论。我使用了securetoken.googleapis.com/v1/token?key='.FIREBASE_KEY 并发布了grant_type=refresh_token&refresh_token='.$user_refreshToken。我得到的结果是{“access_token”:“eyJhbGc..”,“expires_in”:“3600”,“token_type”:“Bearer”,“refresh_token”:“AEu4IL1..”,“id_token”:“eyJhbGciOiJS.. ", "user_id": "u2Jvb4844HN2..", "project_id": "4133...." } 然后我使用了googleapis.com/identitytoolkit/v3/relyingparty/… 并在帖子字段中发布了 id_Token,我得到了
  • 我得到的结果是 { "error": { "code": 400, "message": "INVALID_ID_TOKEN", "errors": [ { "message": "INVALID_ID_TOKEN", "domain ": "全局", "原因": "无效" } ] } }
  • @FrankvanPuffelen 您能否指导我如何重新验证用户身份? TYIA。
  • 对不起,我不知道如何从 PHP 中做到这一点。不过,我建议您更新您的问题,因为很明显需要重新验证。

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


【解决方案1】:

与 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. 使用 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'
    ]
]);

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');

附注:

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

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

  1. 在您的前端使用 Firebase 客户端 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 令牌(= 完整凭据)

【讨论】:

  • 谢谢@jeromegamez!对于详细的解释现在更有意义了。
猜你喜欢
  • 2019-08-13
  • 2018-06-18
  • 2021-02-28
  • 2016-12-13
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
相关资源
最近更新 更多