Есть ли способ удалить пользователя из аутентификации firebase? - PullRequest
0 голосов
/ 24 марта 2019

Я использую Firebase Auth Rest API.У меня есть код, написанный на PHP, чтобы добавить пользователя в базу данных и аутентификацию firebase.Информация, которую я храню, является доброй, idToken, электронная почта, 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 голосов
/ 25 марта 2019

Существует два способа взаимодействия с API-интерфейсами REST Firebase:

  • Путем аутентификации ваших запросов с токеном ID пользователя с теми же правами и ограничениями, как если бы они взаимодействовали с вашим приложением самостоятельно
  • Путем аутентификации с использованием учетных данных Сервисной учетной записи, которая дает вам полный доступ к вашему приложению без каких-либо ограничений.

Чтобы удалить пользователя, вы можете использовать оба метода, но при использовании токена идентификатора пользователя вы должны аутентифицироваться как пользователь (эффективно имитируя его), прежде чем сможете выполнять какие-либо действия от имени указанного пользователя.

Лучшим решением было бы использовать Admin SDK для выполнения этой задачи. Проверяя подлинность ваших запросов к API-интерфейсам Firebase REST с учетными данными учетной записи службы, как описано в Добавьте Firebase Admin SDK на свой сервер , вы сможете более легко выполнять административные задачи (например, удаление пользователя из базы данных аутентификации).

Вот шаги для начала аутентификации на основе учетной записи службы:

  1. Создание учетных данных учетной записи службы на https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk
  2. Используйте библиотеку Google Auth для PHP, чтобы иметь возможность совершать аутентифицированные вызовы API Google / Firebase https://github.com/googleapis/google-auth-library-php#call-the-apis
  3. Когда вы создали HTTP-клиент с помощью библиотеки Auth, вы можете вызвать эту конечную точку 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) было бы рекомендованным способом выполнения административных задач, подобных этому. Официальные SDK существуют для Node.js, Java, Python, Go и C # - я поддерживаю неофициальный для 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');

На примечании стороны:

Я бы посоветовал хранить маркер идентификатора пользователя в отдельной базе данных как угрозу безопасности: если ваша база данных скомпрометирована, злоумышленники получат доступ к токенам идентификатора вашего пользователя и могут использовать те, кто еще не истек, для доступа к вашему приложению.

Рекомендуемый поток для передачи пользователя с вашего веб-интерфейса (веб-интерфейс, мобильный телефон) на ваш сервер (сервер):

  1. Используйте Firebase Client SDK на вашем веб-интерфейсе, например, в вашем веб-приложении
  2. Позвольте пользователю войти в Firebase во внешнем интерфейсе через клиентский SDK, а когда пользователь успешно вошел в систему, получит маркер идентификатора на вашем клиенте , отправит его на сервер и подтвердит идентификационный токен на вашем бэкэнде .
  3. После того, как вы проверили идентификационный токен, вы можете извлечь Firebase ID вашего пользователя из идентификационного токена и сохранить его в своей базе данных, например, в таблице, которая сопоставляет ваш локальный идентификатор пользователя с идентификатором пользователя Firebase без необходимости хранить их маркер полного идентификатора (= полные учетные данные)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...