我正在使用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;
} */
答案 0 :(得分:0)
有两种与Firebase REST API进行交互的方式:
要删除用户,可以使用这两种方法,但是在使用用户的ID令牌时,必须先以用户身份验证(有效地模拟他们),然后才能代表该用户执行任何操作。
更好的解决方案是使用Admin SDK执行该任务。如 Add the Firebase Admin SDK to Your Server中所述,通过使用服务帐户凭据对Firebase REST 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令牌的访问权限,并可以使用尚未过期的令牌来访问您的应用程序。
将用户从您的前端(网络,移动)传递到后端(服务器)的建议流程是: