Выполнить SMS-верификацию на сервере

Чтобы автоматически проверять номера телефонов, необходимо реализовать как клиентскую, так и серверную части потока проверки. В этом документе описывается, как реализовать серверную часть.

Сервер проверки телефона отвечает за три задачи:

  1. Создание проверочного сообщения, которое включает одноразовый код и имеет формат, ожидаемый клиентским API SMS Retriever.
  2. Отправка подтверждающего сообщения на устройство пользователя
  3. Проверка одноразового кода при его отправке обратно на сервер и выполнение любых задач после проверки, которые требуются вашему бэкэнду.

Особенности взаимодействия вашего приложения с сервером зависят от вас. Распространенный подход — предоставить REST API с двумя конечными точками: одна, которая получает запросы на проверку заданного номера телефона и отправляет SMS-сообщения проверки, и вторая конечная точка, которая получает одноразовые коды из вашего приложения.

1. Создайте проверочное сообщение

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

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

Your ExampleApp code is: 123ABC78

FA+9qCX9VSu

Генерация одноразового кода

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

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

ИДЕНТИФИКАТОР Пользователь Срок действия
123456789... 1234 2017-3-14 1:59

Вы можете использовать идентификатор в кодировке Base32 в качестве одноразового кода.

Вычисление хеш-строки вашего приложения

Службы Google Play используют хеш-строку, чтобы определить, какие проверочные сообщения отправлять в ваше приложение. Хэш-строка состоит из имени пакета вашего приложения и сертификата открытого ключа вашего приложения. Чтобы сгенерировать хеш-строку:

  1. Если вы используете подпись приложения через Google Play , загрузите сертификат подписи приложения ( deployment_cert.der ) из раздела «Подписание приложений» консоли Google Play .

    Затем импортируйте сертификат подписи приложения во временное хранилище ключей:

    keytool -importcert -file deployment_cert.der -keystore temporary.keystore -alias PlayDeploymentCert
    

    Если вы подписываете APK-файлы напрямую, пропустите этот шаг.

  2. Получите сертификат подписи приложения — либо тот, который вы импортировали выше, либо тот, который вы используете для прямой подписи APK-файлов — в виде шестнадцатеричной строки в нижнем регистре.

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

    keytool -exportcert -keystore temporary.keystore -alias PlayDeploymentCert | xxd -p | tr -d "[:space:]"
    

    Если вы подписываете APK-файлы напрямую, укажите рабочее хранилище ключей и псевдоним сертификата.

  3. Если вы создали временное хранилище ключей, удалите его.

  4. Добавьте шестнадцатеричную строку к имени пакета вашего приложения, разделив ее одним пробелом.

  5. Вычислите сумму SHA-256 объединенной строки. Обязательно удалите из строки все начальные и конечные пробелы перед вычислением суммы SHA-256.

  6. Base64-кодирует двоичное значение суммы SHA-256. Возможно, вам придется сначала декодировать сумму SHA-256 из ее выходного формата.

  7. Хэш-строка вашего приложения — это первые 11 символов хеша в кодировке Base64.

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

keytool -exportcert -alias PlayDeploymentCert -keystore MyProductionKeys.keystore | xxd -p | tr -d "[:space:]" | echo -n com.example.myapp `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

Кроме того, вы можете получить хеш-строку вашего приложения с помощью класса AppSignatureHelper из примера приложения для получения SMS. Однако если вы используете вспомогательный класс, обязательно удалите его из своего приложения после получения хеш-строки. Не используйте в проверочных сообщениях хэш-строки, динамически вычисляемые на клиенте.

2. Отправьте подтверждающее сообщение по SMS.

После создания проверочного сообщения отправьте его на номер телефона пользователя с помощью любой системы SMS.

Например, см. раздел Проверка приложения с помощью Twilio SMS на сайте разработчика Twilio.

Когда устройство пользователя получает это сообщение, оно направляется в ваше приложение. Ваше приложение извлекает одноразовый код и отправляет его обратно на ваш сервер для завершения процесса проверки.

3. Проверьте одноразовый код при его возврате.

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

  1. Убедитесь, что одноразовый код действителен и срок его действия не истек.
  2. Зафиксируйте, что пользователь, привязанный к одноразовому коду, завершил верификацию номера телефона.
  3. Удалите запись в базе данных об одноразовом коде или каким-либо другим способом обеспечьте невозможность повторного использования того же кода.

Когда вы запишите статус проверки пользователя и удалите одноразовый код из своей базы данных, проверка будет завершена.