Выполните 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. Удалите запись в базе данных одноразового кода или каким-либо другим способом убедитесь, что тот же код нельзя использовать снова.

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