Аутентификация Firebase REST API с помощью номера телефона

Я использую PAW, чтобы попробовать и протестировать различные облачные функции, развернутые с Firebase. Приложение использует аутентификацию по телефону, однако в настоящее время практически нет документации о том, как выполнить аутентификацию по номеру телефона через REST API.

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

Похоже, что мне нужно вызвать метод verifyPhoneNumber, который я собрал вместе, что конечная точка REST API, которая мне нужна, находится в формате:

https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPhoneNumber?key = {WEB_API_KEY}

Теперь я застрял в попытке передать ожидаемые данные. Похоже, эта конечная точка ожидает объекты phoneNumber и applicationVerifier. Я собрал это вместе из соответствующего документация здесь.

Я пытаюсь сделать запрос, который выглядит так:

POST /identitytoolkit/v3/relyingparty/verifyPhoneNumber?key = {WEB_API_KEY}
Content-Type: application/json; charset=utf-8
Host: www.googleapis.com
Connection: close
User-Agent: Paw/3.1.7 (Macintosh; OS X/10.13.6) GCDHTTPRequest
Content-Length: 73

{"phoneNumber":"+18035551111","applicationVerifier":{"type":"recaptcha"}}

Я получаю такой ответ:

HTTP/1.1 400 Bad Request
Vary: X-Origin
Vary: Referer
Content-Type: application/json; charset=UTF-8
Date: Thu, 13 Sep 2018 16:35:33 GMT
Server: ESF
Cache-Control: private
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Alt-Svc: quic = ":443"; ma=2592000; v = "44,43,39,35"
Accept-Ranges: none
Vary: Origin,Accept-Encoding
Connection: close

{
  "error": {
    "code": 400,
    "message": "MISSING_SESSION_INFO",
    "errors": [
      {
        "message": "MISSING_SESSION_INFO",
        "domain": "global",
        "reason": "invalid"
      }
    ]
  }
}

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

Вы нашли для этого какое-нибудь решение?

mosid 05.05.2019 09:28

Нет, я не. Извините.

DjH 05.05.2019 12:53

Почему вы отправляете "applicationVerifier": {"type": "recaptcha"} в качестве значения запроса / Где вы его нашли. Я нашел запросы javascript и нашел там только параметр recaptchaToken:, но не могу получить его по запросу сценария

koa73 04.07.2019 17:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
3
3 153
3

Ответы 3

Для POST REST API вы должны передать токен reCAPTCHA вместо объекта captcha, который вы передаете. Вы можете получить токен в функции обратного вызова при создании RecaptchaVerifier

        window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('my_btn', {
            'size': 'invisible',
            'callback': function(response) {
                // reCAPTCHA solved, allow signInWithPhoneNumber.
                recaptchaToken = response;
                .....
            }
        });            

Эта статья мне помогла - https://medium.com/@shangyilim/verifying-phone-numbers-with-firebase-phone-authentication-on-your-backend-for-free-7a9bef326d02

  1. Создайте запрос кода подтверждения (key - это переменная среды)

send verification code part 1send verification code part 2

  1. (но это необязательно) сделайте информацию сеанса динамическим значением ответа тела

  1. Создайте запрос на подтверждение номера телефона

  1. (опять же, необязательно) сделайте idToken также динамическим значением реакции тела

  1. Используйте динамическое значение idToken в любых других последующих запросах, которые вы выполняете к Firebase.

Лучшее в добавлении переменных в качестве динамических значений ответа тела - это то, что вы можете связать их в цепочку и вызывать их в последовательности:

Я все еще не понял, какое значение имеет sessioninfo и как мне это получить? Кроме того, какой инструмент используется для его создания?

bangbang 05.12.2020 17:30

Я использую PAW, клиент отдыха для MAC OS. Тот же самый, который использует OP и также указал, что использует в своем описании вопроса. sessionInfo - это имя параметра, который firebase ожидает для вызова verifyPhoneNumber.

Danut Pralea 07.12.2020 13:11

После большого количества исследований (я изо всех сил пытаюсь создать автоматические тесты для моего потока «входа в систему с телефона»), я наконец нашел решение для этого, основанное на ответе @Danut Pralea. Надеюсь, это поможет людям в будущем :)

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

POST /v1/accounts:sendVerificationCode?key = {WEB_API_KEY} HTTP/1.1
Host: identitytoolkit.googleapis.com:443
Content-Type: application/json
Content-Length: 39

{
    "phoneNumber": "{PHONE_NUMBER}"
}

Ответ будет sessionInfo, например:

{
    "sessionInfo": "ALiwoWJhYJgtFav1DKc0yBoTwcjjiyQNu240eDJ76GmlH-2i3RmHAYamaPkx3rjEmOBcgrua5QfLw8Nrn_QwjVPO6N09fYsiWQha0-5o2Jb5Hwqxkw7qwsl6YK0gotZ16HmiwqJkyd-stAXTVU1ZIBUwfrFqZmFY7g"
}

Затем следующим шагом будет использование входа в firebase с кодом (тот же, что и в белом списке) и информацией о сеансе:

POST /v1/accounts:signInWithPhoneNumber?key = {WEB_API_KEY} HTTP/1.1
Host: identitytoolkit.googleapis.com:443
Content-Type: application/json
Content-Length: 207

{
    "sessionInfo": "ALiwoWJhYJgtFav1DKc0yBoTwcjjiyQNu240eDJ76GmlH-2i3RmHAYamaPkx3rjEmOBcgrua5QfLw8Nrn_QwjVPO6N09fYsiWQha0-5o2Jb5Hwqxkw7qwsl6YK0gotZ16HmiwqJkyd-stAXTVU1ZIBUwfrFqZmFY7g",
    "code": 123456
}

Вот и все! Ответ будет примерно таким:

{
    "idToken": "idToken",
    "refreshToken": "refreshToken",
    "expiresIn": "3600",
    "localId": "localId",
    "isNewUser": false,
    "phoneNumber": "{PHONE_NUMBER}"
}

Больше информации в официальной документации: https://cloud.google.com/identity-platform/docs/reference/rest/v1/accounts

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