Giter VIP home page Giter VIP logo

sftr-sms's Introduction

sftr assigment

Требуется создать веб сервис для валидации сотовых телефонов.
Дано:

  • Веб Сервис будет использоваться бэкендом какой-то системы и не будет доступен напрямую из фронта
  • Цель веб сервиса - валидировать телефон, при помощи отправки по SMS случайного кода и последующей проверки его. Код не должен быть длинным (нужно, чтобы он был 4-6 цифр)
  • Считаем, что сервису доступен компонент, который умеет отправлять смс. Для целей задания достаточно, чтобы этот компонент просто писал текст и адрес в консоль
  • Сервису не нужно работать с persistent store, достаточно все держать в памяти Сервис нужно спроектировать, реализовать и документировать его REST запросы. Что хочется от этого сервиса:
  • Исключить валидацию телефона пользователем, которому телефон не принадлежит. Несмотря на любые его действия.
  • Исключить ситуации, когда в результате сделанной им ошибки, пользователь вынужден обращаться в службу поддержки и не может более провалидировать телефон самостоятельно.
  • Минимизировать возможности третьего лица, знающего мой телефон, создать мне неудобства при работе с системой.

На что смотрим:

  • Выполнение условий, описанных выше
  • Четкость и внятность кода
  • Оформление в проект, удобный для понимания, сборки, запуска
Solution

Давайте разбираться.
По тексту я вижу, что ответственность сервиса — убедиться, что пользователь действительно имеет доступ к номеру. Сервису не нужно знать про пользователей, права или роли — достаточно лишь отличать их друг от друга. Проблемы, не касающиеся непосредственно подтверждения, лежат на использующем сервис бэке — например, разрешение ситуации «два юзера подтвердили один и тот же номер», «юзер потерял доступ к номеру и хочет привязать другой». Это его логика.

Во-первых, мы включаем авторизацию, не давая злоумышленнику слать запросы от лица кого-то другого (просто скрывать адрес сервера — не защита). Авторизуется именно сервис-потребитель, не пользователь.
Логин и пароль вхардкожены в конфигу, но их можно унести в проперти, БД, наконфигурить упомянутый на собеседованиии JWT.

У нас есть два метода:

  1. sendCode(phoneNumber, userId)
  2. verifyCode(code, phoneNumber, userId)

Сервис-потребитель проставляет в запросы id пользователя, какой бы он они был (и потому он типа String). Id мы запоминаем, чтобы не дать злоумышленнику выполнить verify вслед за send от подлинного пользователя, потратив его попытки.

Внутри мапка с номером и информацией о процессе подтверждения (у нас не хайлоад, она может переварить достаточно пользователей, база в памяти пока не нужна).

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

Если мы решим интегрироваться с несколькими сервисами сразу, нужно будет различать запросы одного пользователя из разных сервисов (я могу захотеть прикрепиться везде и сразу без пауз).
Самый простой разумный способ — ввести дополнительное поле в оба запроса, и делать конкатенацию при работе с мапкой, использовать в качестве ключа что-то вроде «9139159184_DOSTAVKARU», хэшмапа это стерпит.

sftr-sms's People

Contributors

codeleventh avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.