Как верифицировать номер пользователя: SMS или код на PHP

Аватарка пользователя Станислав Романов

Рассказали, как верифицировать номер телефона пользователя через SMS с помощью кода на PHP и готовых решений.

Предположим, возникла задача проверять номера пользователей. Нужно отправлять случайно сгенерированные SMS-коды, чтобы верифицировать их номера телефонов. С чего начать?

Алгоритм такой:

  1. Пользователь вводит номер телефона.
  2. Высылаете SMS-код.
  3. Пользователь вводит этот код.
  4. Если код верный, пользователь проходит дальше.

Какие вопросы могут возникнуть:

  • Как случайно генерировать код.
  • Какой выбрать сервис SMS-рассылок с API.

Вопрос распадается на несколько кусочков. Начнём с самого простого – случайной генерации кода. На PHP это можно сделать, используя функции для работы с случайными числами и строками, например, rand().

Если работаете с PHP 7, то берете более криптографически безопасную функцию random_int(). Для случайного цифрового кода можно сделать так:

			// Генерация случайного числового кода из 6 цифр

$randomCode = random_int(100000, 999999);
		

Если предпочитаете вариант посложнее, то есть алфавитно-цифровой код, то понадобится random_bytes() или более старый вариант mt_rand(). В этом случае код будет таким:

			// Генерация случайной алфавитно-цифровой строки длиной 8 символов

$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

$randomString = '';

$length = 8;

for ($i = 0; $i < $length; $i++) {

        $randomString .= $characters[random_int(0, strlen($characters) - 1)];

}
		

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

Далее сгенерированный код вам надо автоматически отправить пользователю. Если выбрали SMS-провайдера, то многое зависит от его условий. Можно обратиться к МТС Exolve. Вот универсальный вариант кода на PHP для отправки SMS с помощью HTTP-запроса к любому SMS-провайдеру:

			// Данные для запроса
$apiEndpoint = '<YOUR_API_ENDPOINT>';   // URL API SMS-провайдера
$apiKey = '<YOUR_API_KEY>';                 // API-ключ или токен
$senderNumber = '<SENDER_NUMBER>';          // Номер отправителя
$recipientNumber = '+1234567890';       // Номер получателя
$message = 'Привет! Ваш код подтверждения: 123456';  // Текст сообщения, например, с randomCode
// Параметры для POST-запроса
$data = array(
        'api_key' => $apiKey,
        'from' => $senderNumber,
        'to' => $recipientNumber,
        'text' => $message
);
// Создание HTTP-запроса
$options = array(
        'http' => array(
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',
            'content' => http_build_query($data),
        ),
);
$context = stream_context_create($options);
$result = file_get_contents($apiEndpoint, false, $context);
if ($result === false) {
        echo "Ошибка при отправке SMS";
} else {
        echo "SMS успешно отправлено!";
}
		

Надо только заменить <YOUR_API_ENDPOINT>, <YOUR_API_KEY>, <SENDER_NUMBER> и другие параметры на соответствующие значения, предоставленные вашим SMS-провайдером.

И немного про варианты без SMS:

  1. Электронная почта. Вместо SMS-кода отправляем пользователю электронное письмо с проверочной ссылкой или временным кодом для подтверждения их идентификации.
  2. Парольная авторизация — стандартный метод входа на сайт с использованием пароля.
  3. Двухфакторная аутентификация (2FA), то есть работаем с приложениями для генерации базе одноразовых временных кодов (например, Google Authenticator или Authy).
  4. Социальная авторизация через аккаунты в социальных сетях (например, VK, Google, Twitter).
  5. Протокол аутентификации и авторизации OpenID Connect, чтобы пользователи могли использовать свои учетки с других веб-сервисов.
  6. Дать пользователям доступ к вашему сайту через сторонние приложения с помощью протокола OAuth.
PHP
467