Микросервис otp-verifier

В статье описываются логика работы, функции, конфигурация и методы микросервиса otp-verifier.

Микросервис otp-verifier отправляет одноразовые пароли, необходимые для регистрации и авторизации в системе. Он также хранит информацию об отправленных кодах, полученных JWT-токенах, осуществляет аудит данных и проверяет соответствие одноразового пароля отправленному коду. 

Доступ к микросервису предоставляется по запросу.

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

При соответствии одноразового пароля отправленному коду генерируется JWT-токен, который имеет срок жизни 5 минут. Для генерации подписей JWT-токена используется алгоритм RS256.

Не требуются.

/api/otp-verifier/

Параметры конфигурации указываются в Vault.

Vault используется на нашей платформе в качестве хранилища всех конфигураций развертывания.

По умолчанию

{

  "env": {
    "DB_HOST": "хост для подключения к БД",
    "DB_PASSWORD": "пароль для обычного пользователя БД",
    "DB_PASSWORD_MIGRATION": "пароль пользователя БД, выполняющего миграцию",
    "INTEGRATION_IDGTL_TOKEN": "IDGTL_token",
    "INTEGRATION_IDGTL_URL": "https://xxxxx.yy",
    "JAVA_XMS": "XXm",
    "JAVA_XMX": "YYYm",
    "KAFKA_BROKER_ADDRESS": "адрес_брокера_kafka",
    "LOGGING_LEVEL": "INFO",
    "OTP_CALL_AUTHOR_NAME": "ecom_call",
    "OTP_CALL_ENABLED": "true",
    "OTP_CALL_INTEGRATION": "blank",
    "OTP_MAX_CONCURRENT_SESSIONS": "5",
    "OTP_MAX_SEND_ATTEMPTS": "5",
    "OTP_PUSH_ENABLED": "false",
    "OTP_PUSH_FIREBASE_CREDENTIALS": "firebase_credentials",
    "OTP_PUSH_FIREBASE_ENABLED": "true",
    "OTP_PUSH_INTEGRATION_ENABLED": "true",
    "OTP_PUSH_TITLE": "DigitalChief Ecom",
    "OTP_SESSION_TTL": "session_ttl",
    "OTP_SMS_AUTHOR_NAME": "sms_promo",
    "OTP_SMS_ENABLED": "true",
    "OTP_SMS_INTEGRATION": "blank",
    "OTP_TTL": "ttl",
    "OTP_VERIFICATION_TOKEN_ISSUER": "otp-verifier",
    "OTP_VERIFICATION_TOKEN_PRIVATE_KEY": "открытый_ключ_otp",
    "OTP_VERIFICATION_TOKEN_PUBLIC_KEY": "закрытый_ключ_otp",
    "OTP_VERIFICATION_TOKEN_TTL": "token_ttl",
    "TOTP_ALGORITHM": "sha1",
    "TOTP_LENGTH": "8",
    "TOTP_PERIOD": "30S",
    "TOTP_PLATFORM_KEYS": "keys"
  }
}

Copy-icon
Указываемые на каждом отдельном стенде

{
  "env": {

    "OTP_MESSAGE_AUTHOR_NAME": "имя_автора_сообщения",
    "OTP_SENDER": "отправитель",
    "OTP_SENDER_API_TOKEN": "api_токен_службы_отправителя",
    "OTP_SENDER_URL": "url_службы_отправителя",
    "POSTGRES_HOST": "хост_бд",
    "POSTGRES_MIGRATION_PASSWORD": "пароль",
    "POSTGRES_PASSWORD": "пароль_бд"
  }
}


Copy-icon

Методы микросервиса Copy-icon

  • Проверка кода верификации пользователя - POST запрос, /v1/verify-by-otp
Request parameters
  • phone: параметр тела запроса, обязательный: номер телефона в формате +XXX(YYY)ZZZ, где XXX - код страны, YYY - код оператора, ZZZ - остальные цифры;
  • otp: параметр тела запроса, обязательный: 4-значный код OTP;
  • usageType: параметр тела запроса, обязательный:  тип использования OTP. Принимает значение authorize.
Request body sample

{
  "phone": "+7(111)1111111",
  "otp": "1111",
  "usageType": "authorize"
}

Copy-icon
Response sample
{
  "otpVerificationToken": {
    "value": "otp-verification-token-value" //Сгенерированный токен
  ,"expiresAt": 1634025600 //Время, когда истекает токен (формат unix epoch seconds)
  ,"expiresIn": 600 //Время до истечения действия токена (в секундах)
  }, "remainingVerifyOtpAttempts": 3 //Кол-во оставшихся попыток ,"verified": true                   //Флаг, указывающий на успешную (true) либо неуспешную (false) проверку OTP кода.
}
Copy-icon
Response codes
  • 200 - операция выполнена успешно, получены данные о проверке кода верификации
  • 400 - ошибка, невалидный запрос
  • 500 - ошибка, Internal Server Error
  • Отправка кода верификации пользователю - POST запрос, /v1/send-otp
Request parameters
  • phone: параметр тела запроса, обязательный:  номер телефона в формате +XXX(YYY)ZZZ, где XXX - код страны, YYY - код оператора, ZZZ - остальные цифры;
  • sendType: параметр тела запроса, обязательный: тип отправки OTP кода. Принимает значения push или sms ;
  • usageType: параметр тела запроса, обязательный: тип использования OTP. Принимает значение authorize;
  • pushProvider: параметр тела запроса, обязательный: провайдер push-уведомлений.
Request body sample
{
  "phone": "+7(111)1111111",
  "sendType": "SMS",
  "usageType": "AUTHORIZE",
  "pushProvider": "FIREBASE"
}
Copy-icon
Response sample
{
  "otpLength": 0                      //Длина сгенерированного OTP-кода
,"nextAttemptTimestamp": 0 //Временная метка следующей попытки отправки OTP в формате UNIX
,"nextAttemptDelay": 0 //Задержка перед следующей попыткой отправки OTP в секундах
  ,"remainingVerifyOtpAttempts": 0 // Кол-во оставшихся попыток }
Copy-icon
Response codes
  • 200 - операция выполнена успешно, код верификации отправлен пользователю
  • 400 - ошибка, неправильный запрос
  • 500 - ошибка, Internal Server Error
  • Проверка валидности выданного OTP токена - POST запрос, /v1/verify-otp-token
Request parameters
  • phone: параметр тела запроса, обязательный: номер телефона в формате +XXX(YYY)ZZZ, где XXX - код страны, YYY - код оператора, ZZZ - остальные цифры;
  • token: параметр тела запроса, обязательный: токен для проверки;
  • usageType: параметр тела запроса, необязательный:  цель использования токена. По умолчанию undefined
Request body sample
{
  "phone": "+7(111)1111111",
  "token": "otp-verification-token-value",
  "usageType": "AUTHORIZE"
}
Copy-icon
Response sample
{
  "verified": true
}
Copy-icon
Response codes
  • 200 - операция выполнена успешно, получены данные о проверке проверки валидности выданного OTP verification токена
  • 400 - ошибка, неправильный запрос (не указано одно из обязательных полей)
  • 500 - ошибка, Internal Server Error
  • Ручная инвалидация локального кэша сервиса - POST запрос, /v1/cache/invalidate-all
Request parameters

Отсутствуют

Request body sample

Отсутствует

Response sample
{
  "timestamp": "string",
  "status": 0,
  "error": "string",
  "code": "string",
  "message": "string",
  "payload": {},
  "path": "string",
  "validation": {
    "errors": [
      {
        "codes": [
          "string"
        ],
        "arguments": [
          {}
        ],
        "defaultMessage": "string",
        "objectName": "string",
        "code": "string"
      }
    ]
  }
}
Copy-icon
Response codes
  • 200 - успешная инвалидация локального кэша
  • 500 - ошибка, Internal Server Error

Связанные статьи

Микросервисы