Опубликовано в

Двухфакторная авторизация (2FA) на Java

Двухфакторная авторизация 2FA на Java фото

Сегодня мы расскажем как сделать двухфакторную авторизацию (2FA) на Java

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

После нажатия на “получить смс” пользователь получит сообщение вида CODE20.
Где CODE20 — это строка от 1 до 16 символов, состоящая из букв, цифр или букв и цифр одновременно. 

Итак, пользователь нажал “получить смс”.
Вы отправляете запрос на SMS.BY — sendSmsWithCode()
Данный вызов API вернет вам код сообщения “CODE20” и этот же код будет отправлен пользователю.
Пользователь вводит код и вы проверяете, что код совпадает, и если все ОК — то пропускаете пользователя дальше.

Теперь подробнее с примерами кода

Для начала давайте распишем алгоритм: 

  1. Создать объект класса SMS_BY 
  2. Указать токен 
  3. Настроить PasswordObject 
  4. Получить ID PasswordObject
  5. Вызвать метод sendSmsWithCode
  6. Сравнить вводимый код от пользователя с тем, который вернут метод sendSmsWithCode

Качаем исходники отсюда

Двухфакторная авторизация работает следующим образом.

Вы настраиваете длину и конфигурацию пароля, после этого у вас будет ID.
Далее по этому ID вы отправляете смс и в ответ вам приходит код, который отправляется пользователю.
В нашей системе такая настройка реализуется через PasswordObject.
PasswordObject — это настройки, которые вы можете использовать в двухфактороной верификации.
Например вам надо, чтобы пароль состоял только из только букв или только цифр или и то и другое, с длиной пароля в 5 символов.

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

[cce lang=»java» tab_size=»5″ lines=»14″ width=»860″]

// настройка длины пароля при двухфакторной авторизации с длиной пароля в 5 символов.

createPasswordObject(SMS_BY.PASS_TYPE_LETTERS, 5) ; // только буквы латиницы

createPasswordObject(SMS_BY.PASS_TYPE_NUMBERS, 5) ; // только цифры

createPasswordObject(SMS_BY.PASS_TYPE_BOTH, 5) ;    // и буквы и цифры

[/cce]

Чтобы отправить смс с кодом нужно сделать вызов:

[cce lang=»java» tab_size=»5″ lines=»14″ width=»860″]

oStart.sendSmsMessageWithCode(«Ваш пароль: %CODE%», «245», phone,alphaname_id  );

«Ваш пароль: %CODE%» — текст сообщения, %CODE%
— обязательный параметр, вместо %CODE% будет подставлен<

сгененированный пароль для получателя.

«245» — это ID PasswordObject созданный ранее

phone — номер телефона

alphaname_id — ID Альфа-имени, если Альфа-имени пока нет, нужно передавать 0

sendSmsMessageWithCode вернет:

{«status»:»ok»,»parts»:1,»len»:21,»sms_id»:2208471,»code»:»GAYXILYZOX»}

[/cce]

Из этого сообщения вам надо получить код, который будет вводить пользователь на форме двухфакторной авторизации:

[cce lang=»java» tab_size=»5″ lines=»14″ width=»860″]

code = GAYXILYZOX

[/cce]

Пример кода:     

[cce lang=»java» tab_size=»5″ lines=»14″ width=»860″]

String password_object_id  = oStart.createPasswordObject(«both»,4);

Integer alphaname_id       = new Integer(0);

str = oStart.sendSmsMessageWithCode («Ваш пароль: %CODE%», password_object_id,SMS_BY_Sample.phone,alphaname_id  );

SMS_BY_Sample.print(str);

[/cce]