Задать вопрос

Регистрация по номеру телефона?

Пишу авторизацию/регистрацию по номеру телефона. Имеется два URL:
/api/request - POST запрос для отправки кода, принимаю только номер телефона, делаю валидацию номер, также ограничиваю на отправку кол-во кодов.
/api/confirm - POST запрос на проверку кода. Вот тут я и попал в тупик. Какие тут должны быть проверки помимо проверки самого кода? Мой вариант реализации такой:
Принимаем номер (мы его знаем) и принимаем код от пользователя. Дальше просто проверяем код и все. Можно также ограничить на попытки спама кодов.

Честно говоря, полная реализация выглядит так себе для обеих УРЛОВ. Может, кто-то писал данную авторизацию, хочу увидеть реализацию или текст как я должен обрабатывать/проверять это.

Прошелся по сайтам где регистрация по номеру и там при отправки кода/проверки кода передаются какие-то токены. Судя по всему, токены создаются при заходе на сайт и все.

Мой код:
const { parsePhoneNumberFromString } = require('libphonenumber-js');

const isValidPhoneNumber = (phone, country) => {
    const parsePhoneNumber = parsePhoneNumberFromString(phone, country);

    if (!parsePhoneNumber || !parsePhoneNumber.isValid()) return null;
    return parsePhoneNumber;
}

exports.requestController = (req, res) => {
    const { phone } = req.body;

    const formattedNumber = isValidPhoneNumber(phone);

    if (!phone || !formattedNumber) {
        return res.status(400).json({ 
            message: 'Incorrect number' 
        })
    }
    return res.status(200).json(formattedNumber.formatInternational())
}

exports.confirmController = (req, res) => {
    const { phone, code } = req.body;

    res.json({ message: 'confirm code' })
}
  • Вопрос задан
  • 1367 просмотров
Подписаться 4 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@knigaman
Первый запрос = принимаем на сервере номер телефона, генерируем токен (случайная строка длиной, предположим, 64 символа - цифры, буквы большие и маленькие), отправляем его на клиент. Генерируем код доступа, отправляем его смской на телефон. В зависимости от логики можем и не отправлять (если допустим у нас метод для логина а такого юзера еще нет (он еще не зарегистрирован)).

Второй запрос = отправляем с клиента токен (тот 64 символьный полученный от сервера) и строку с кодом из смс. Проверяем на сервере токен и код из смс, если все ок - пускаем в аккаунт.

Примечания:
1) токены и сами попытки входа должны жить определенное количество времени, предположим 5 минут.
2) попытки ввода кода (неправильные вводы) должны быть ограничены разумным числом (ну допустим 5 попыток)
3) если можно то лучше код сделать длиннее - хотя бы 6 цифр, а лучше 8 и более.
4) попытки входа в аккаунт можно ограничить, но тогда будет можно абузить эту "фичу" и блокировать вход чувакам, тут выбираем меньшее из зол исходя из бизнес требований
5) можно экономить на смсках и доставлять код в последних цифрах номера / голосовой озвучкой, отправлять в вк, ватсап, телеграм, вайбер

500 айкью примечания для кое какой защиты от слива бюджета:
1) можно юзать капчу (можно не всегда а когда начинается аномалия по отправке кодов - всплеск количества отправок)
2) как уже и говорил разделение входа и регистрации
3) ставим бот защиту от какого нибудь сервиса по защите от ддос/бот атак
4) иногда можно не отправить код а отправить клиенту респонс что код отправлен, если клиент вводит код - скорее всего это атака. человек же запросит код повторно (потому что он тупо ему не пришел)
5) иногда можно отправить код не сразу а через предположим, 30 секунд - если ввели код раньше - значит что-то не так
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы