Проверка подлинности телефона на стороне сервера Firebase + PHP

Я создаю настраиваемую систему управления пользователями, в которой все данные приложения должны находиться на сервере приложений, но телефон должен быть аутентифицирован firebase. Когда новый пользователь регистрируется в системе, происходит аутентификация телефона Firebase. При успешной аутентификации из firebase регистрационные данные поступают на сервер через API. Теперь проблема в том, как мне проверить на стороне сервера, что номер телефона аутентифицирован firebase или нет? Если я разрешаю регистрацию без проверки подлинности Firebase на стороне сервера, запрос API может быть кем-то подделан. В настоящее время я использую kreait/firebase-php ^4.18 Firebase SDK для PHP. Поток, который я использую прямо сейчас, показан ниже Проверка подлинности телефона на стороне сервера Firebase + PHP, и поток, который я хочу реализовать, также может быть задан как Проверка подлинности телефона на стороне сервера Firebase + PHP

Обновление 25.09.2019

Библиотека Kreait\Firebase помогла реализовать поток, как указано в ответе @jeromegamez в принятом ответе. Однако Kreait\Firebase не поддерживает проверку idToken для устройства ios. Устройство IOS имеет идентификатор Google idToken, а не идентификатор firebase IdToken, и, следовательно, Kreait\Firebase не смог его проверить. Краткий выпуск дан в посте Недопустимый идентификатор idToken Firebase IOS kid Исключение в серверной части, а verifyIdToken в Gmail Auth.

Я забыл упомянуть, что первый поток уязвим для ложной регистрации.

Kiran Maniya 12.03.2019 13:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
1
11 580
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Как только номер телефона связан с пользователем в вашей базе данных Auth, вы можете быть уверены, что

  • номер телефона действителен
  • номер телефона был успешно использован для аутентификации пользователя в момент времени, когда номер был связан с указанным пользователем
  • номер телефона не может быть связан с другим пользователем

Вы не следует предполагаете, что этот номер телефона теперь "подтвержден". Как указано на официальных страницах документации Firebase:

Security concerns

Authentication using only a phone number, while convenient, is less secure than the other available methods, because possession of a phone number can be easily transferred between users. Also, on devices with multiple user profiles, any user that can receive SMS messages can sign in to an account using the device's phone number.

If you use phone number based sign-in in your app, you should offer it alongside more secure sign-in methods, and inform users of the security tradeoffs of using phone number sign-in.

Source: https://firebase.google.com/docs/auth/web/phone-auth#security-concerns

PS: Единственный другой способ добавить номер телефона пользователю — через Admin SDK, и здесь вы несете ответственность за то, чтобы номер телефона принадлежал пользователю.

PSS: Насколько мне известно (и проверено), API-интерфейсы Firebase REST не предоставляют информацию о «подтвержденном номере телефона».

это не связано с раскрытием сведений о проверенном номере телефона. Я работаю параллельно с Firebase и своим сервером. Когда пользователь проверяет свой телефон, в случае успеха он вызывает мой оставшийся API с этим номером телефона, проблема заключается в том, как мне убедиться, что номер телефона проверен firebase или нет в реализации на стороне сервера?

Kiran Maniya 15.03.2019 09:02

Если это ваше приложение для мобильного телефона и приложение на стороне сервера, вы должны быть в состоянии доверять себе. Пользователь проверяет свой телефон из вашего приложения, затем вы отправляете (подтвержденный) номер телефона на серверную часть. В своем бэкэнде вы проверяете с помощью Firebase API, что номера телефонов совпадают, и все готово.

jeromegamez 15.03.2019 17:36

Что делать, если какой-либо пользователь декодирует приложение и получает API, вызываемый при успешной аутентификации. Этот API также может работать с Postman.

Kiran Maniya 16.03.2019 06:22

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

jeromegamez 16.03.2019 15:29

@jeromegamez. Я понимаю озабоченность КиранМании. Обычно API защищен токеном доступа приложения после входа пользователя в систему. Но в этом случае пользователи находятся между процессом аутентификации (поэтому мы аутентифицируем их номер телефона), поэтому API пока не может быть защищен.

Daron Tancharoen 13.08.2020 08:26

API Firebase Rest имеет метод для этого.

На устройстве, после того, как пользователь аутентифицирован и у вас есть объект User, чтобы получить токен для проверки, вы можете вызвать

  • с Android – getIdToken()
  • с iOS
    • Стриж - getIDToken()
    • Цель-C — -getIDTokenWithCompletion:
  • с JS (веб или другие платформы) — getIdToken()
  • с React Native — getIdToken()
  • и куча других платформ в документации

Затем с помощью этого токена с временным идентификатором вы можете отправить POST-запрос на https://identitytoolkit.googleapis.com/v1/accounts:lookup?key=[API_KEY] (API_KEY является «Ключом веб-API» проекта Firebase), чтобы получить информацию о пользователе, которая будет включать phoneNumber владельца токена.

Таким образом, вы можете проверить на стороне сервера, что у владельца токена есть этот конкретный номер телефона.

Именно то, что я искал! Не удалось использовать предложенный Firebase способ проверки ( firebase.google.com/docs/auth/admin/… ), потому что наш бэкенд - это платформа php, и они не предоставляют для нее библиотеки проверки. Они предоставляют немного информации о ручной проверке этого токена JWT, но... черт возьми.

Starwave 02.09.2021 14:19

Другие вопросы по теме