Синхронизировать пользователей, созданных с помощью Firebase Auth, с моим пользовательским бэкэндом

#firebase #firebase-authentication #google-cloud-functions

#firebase #firebase-аутентификация #google-cloud-функции

Вопрос:

Я хочу использовать Firebase Auth для моего процесса входа / регистрации пользователя. Все остальное должно обрабатываться моим собственным бэкэндом (spring boot app postgres db).

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

  1. Вызов REST через клиент — каждый раз, когда я получаю событие успеха из firebase sdk, я вызываю дополнительный запрос к своему бэкэнду, который отправляет uid, имя пользователя и т. Д.

Проблема: Что делать, если мой внутренний вызов завершится неудачей, но процесс регистрации прошел успешно? Это привело бы к несогласованному состоянию, поскольку (по крайней мере, это то, что я понял) Я не могу легко выполнить откат. Это может привести к ситуациям, когда пользователь может войти в мое приложение, не зная пользователя. Это приведет к сбою / аннулированию всех моих следующих запросов (например, поиск после пользователя xyz не приведет ни к какому результату, даже если он / она существует)

  1. Проверьте наличие пользователя в базе данных postgres

Здесь я бы запросил uid из базы данных (которую я получил от jwt) и создал нового пользователя, если он не существует в каждом входящем запросе.

Проблема: пользовательский запрос — это ненужные накладные расходы для каждого входящего запроса.

  1. Запуск с помощью облачных функций — когда я правильно понял, firebase auth запускает события при создании нового пользователя в облачных функциях. Это может быть использовано для выполнения внешнего вызова api.

Проблема: я не знаю, что происходит, когда мой внешний вызов rest завершается с ошибкой на этом этапе. Могу ли я отменить регистрацию? Смогу ли я когда-нибудь снова перехватить это событие? У меня также, вероятно, возникнет возможная ситуация с согласованностью, поскольку я не знаю, когда запускается облачная функция. Кроме того, я бы предпочел не включать облачные функции в свой стек

Есть ли какой-нибудь способ, как я мог бы сделать это транзакционным способом? Кто-нибудь еще пытался использовать sth simular?

Спасибо за любую помощь!

Комментарии:

1. Это отличный вопрос, я пытаюсь сделать что-то подобное, например, инициализировать некоторые пользовательские данные сразу после входа в систему, в идеале я надеюсь, что эта операция может быть частью процесса регистрации в firebase…

Ответ №1:

Самый простой способ — на самом деле не синхронизировать данные аутентификации, а вместо этого декодировать и проверять идентификационный токен пользователя в вашем бэкэнд-коде.

Эта операция (по замыслу) не имеет состояния, хотя собственные серверные службы Firebase часто используют кэш недавно декодированных токенов для ускорения будущих вызовов с тем же идентификатором ID.

Комментарии:

1. Проверка была мне понятна, но я не могу продолжить без сохранения пользовательских данных. Мне нужна модель пользователя в моей БД для связи с другими объектами, выполнения поиска и т.д. Я хочу быть гибким с этими данными. Ваше предложение на самом деле не является решением для меня

2. Итак, как насчет сохранения информации из токена ID в вашей базе данных, когда поступит запрос? Итак, по каждому запросу: расшифруйте токен, сохраните (или обновите) эту информацию в своей базе данных, передайте запрос в нужное место.

3. Итак, в основном вариант 2. моего первоначального вопроса? Я не хочу этого делать, так как тогда мне приходится запрашивать свою базу данных во всех возможных запросах API, предлагаемых моим бэкэндом. Это звучит немного неэффективно, потому что пользователь, который использует приложение, все равно будет запускать этот запрос. Или вы имели в виду что-то другое? Спасибо за ответ

4. Если вы можете выполнить upsert, вам не нужно будет выполнять отдельный запрос.

5. Ну, операция записи звучит еще хуже: D

Ответ №2:

По-видимому, я, наконец, придумал другое решение:

  1. Зарегистрируйте пользователя для Firebase SDK (например, с помощью метода email pw)
  2. Выполните последующий вызов моего собственного API регистрации, включая результирующий uid с предыдущего шага и некоторые метаданные
  3. API создает нового пользователя, включая столбец с UID Извлекает токен firebase пользователя и добавляет внутреннее утверждение, которое ссылается на внутренний Postgres UUID через Admin SDK.
  4. Интерфейс получает созданного пользователя и жестко обновляет (очень важно, поскольку ранее выбранный токен не будет содержать вновь добавленное утверждение!) Токен firebase и проверяет, содержит ли он токен. Если это произойдет -> все в порядке, если не произошло какого-то сбоя 🙂 Для этого потребуется повторить попытку запроса.

Позже, когда вы запустите свое приложение, вы можете просто проверить, содержит ли переданный токен пользовательское утверждение, если нет, откройте страницу регистрации / входа. Каждая конечная точка, кроме той, которая предназначена для регистрации, должна проверять, установлено ли утверждение. Если нет, просто запретите запрос.

Как установить пользовательские утверждения: https://firebase.google.com/docs/auth/admin/custom-claims#set_and_validate_custom_user_claims_via_the_admin_sdk