111

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

 

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

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
<span style="font-weight: 400;">// настройка длины пароля при двухфакторной авторизации с длиной пароля в 5 символов.</span>

<span style="font-weight: 400;">createPasswordObject(StartSend.PASS_TYPE_LETTERS, 5) ; // только буквы латиницы</span>

<span style="font-weight: 400;">createPasswordObject(StartSend.PASS_TYPE_NUMBERS, 5) ; // только цифры</span>

<span style="font-weight: 400;">createPasswordObject(StartSend.PASS_TYPE_BOTH, 5) ;    // и буквы и цифры</span>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
<span style="font-weight: 400;">oStart.sendSmsMessageWithCode("Ваш пароль: %CODE%", "245", phone,alphaname_id  );</span>

<span style="font-weight: 400;">"Ваш пароль: %CODE%" - текст сообщения, </span><b>%CODE%</b><span style="font-weight: 400;"> - обязательный параметр, вместо %CODE% будет подставлен</span><span style="font-weight: 400;"> сгененированный пароль для получателя.</span>

<span style="font-weight: 400;"> "245" - это ID PasswordObject созданный ранее</span>

<span style="font-weight: 400;">phone - номер телефона</span>

<span style="font-weight: 400;">alphaname_id - ID Альфа-имени, если Альфа-имени пока нет, нужно передавать 0</span>

<span style="font-weight: 400;">sendSmsMessageWithCode вернет:</span>

<span style="font-weight: 400;">{"status":"ok","parts":1,"len":21,"sms_id":2208471,"code":"GAYXILYZOX"}</span>

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

1
<span style="font-weight: 400;">code = GAYXILYZOX</span>

Пример кода:     

1
2
3
4
5
6
7
<span style="font-weight: 400;">String password_object_id  = oStart.createPasswordObject("both",4);</span>

<span style="font-weight: 400;">Integer alphaname_id       = new Integer(0);</span>

<span style="font-weight: 400;">str = oStart.sendSmsMessageWithCode("Ваш пароль: %CODE%", password_object_id, StartSendSample.phone,alphaname_id  );</span>

<span style="font-weight: 400;">StartSendSample.print(str);</span>