/*
  Сервис предоставляет возможность авторизации
*/
syntax = "proto3";

import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "google/protobuf/timestamp.proto";
import "keyapis/identity/v1/keyapis_identity_authorization_v1.proto";


package keyapis.identity.v1;

option java_package = "ru.keyapis.identity.v1";
option java_outer_classname = "KeyapisIdentityV1Proto";
option java_multiple_files = false;
option java_string_check_utf8 = true;
option go_package = "/keyapis_identity_v1";
option cc_enable_arenas = true;
option csharp_namespace = "Keyapis.Identity.V1";
option objc_class_prefix = "KEYAPISIDENTITYV1";
option php_namespace = "Keyapis\\Identity\\V1";
option ruby_package = "Keyapis::Identity::V1";
option optimize_for = LITE_RUNTIME;

// Сервис авторизации пользователей по процедуре OAuth2
service Oauth2Service {
  // Метод авторизации по ОТП-коду по процедуре OAuth2.
  // Метод возвращает переадресацию в виде GRPC метаданных x-http-code и location.
  // Не требует авторизации
  rpc PostOauth2LoginByCode(PostOauth2LoginByCodeRequest) returns (PostOauth2LoginByCodeResponse) {
    option (google.api.http) = {
      post: "/identity/api/v1/oauth2/login_by_code",
      body: "*"
    };
  }
  // Метод авторизации по паролю по процедуре OAuth2.
  // Метод возвращает переадресацию в виде GRPC метаданных x-http-code и location.
  // Не требует авторизации
  rpc PostOauth2LoginByPassword(PostOauth2LoginByPasswordRequest) returns (PostOauth2LoginByPasswordResponse) {
    option (google.api.http) = {
      post: "/identity/api/v1/oauth2/login_by_password",
      body: "*"
    };
  }
  // Метод запроса соглашения пользователя по процедуре OAuth2.
  // Метод возвращает переадресацию в виде GRPC метаданных x-http-code и location.
  // Не требует авторизации
  rpc GetOauth2Consent(GetOauth2ConsentRequest) returns (GetOauth2ConsentResponse) {
    option (google.api.http) = {
      get: "/identity/api/v1/oauth2/consent"
    };
  }
}

// Ошибки авторизационного сервиса
message AuthServiceError {
  // Ошибки авторизационного сервиса
  message AuthError {}

  // Причина ошибки
  oneof reason {
    // Ошибки авторизационного сервиса
    AuthError auth = 1;
  }
}

// Запрос на авторизацию по ОТП-коду
message PostOauth2LoginByCodeRequest {
  // Идентификатор ОТП-кода
  string code_id = 1 [(google.api.field_behavior) = REQUIRED];
  // Значение ОТП-кода
  string code = 2 [(google.api.field_behavior) = REQUIRED];
  // Идентификатор текущей попытки логина пользователя
  string login_challenge = 3 [(google.api.field_behavior) = REQUIRED];
}

// Ответ на запрос об авторизации пользователя
message PostOauth2LoginByCodeResponse {
  // Ошибка запроса авторизации пользователя
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка отп-кода
      OtpCode.Error otp_code = 1;
      // Ошибка из ССО
      SsoError sso = 2;
      // Ошибки сервисов ключа
      KeyError key = 3;
      // Ошибки авторизационного сервиса
      AuthServiceError auth_service = 4;
    }
  }

  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
  }
}

// Запрос на авторизацию по паролю
message PostOauth2LoginByPasswordRequest {
  // Вариант авторизации
  oneof type {
    // Номер телефона
    string phone_number = 1;
    // Электронная почта
    string email = 2;
    // Логин
    string login = 3;
  }

  // Пароль
  string password = 4 [(google.api.field_behavior) = REQUIRED];
  // Ответ на капчу
  CaptchaAnswer captcha_answer = 5 [(google.api.field_behavior) = OPTIONAL];
  // Идентификатор текущей попытки логина пользователя
  string login_challenge = 6 [(google.api.field_behavior) = REQUIRED];
}

// Ответ на запрос об авторизации по паролю пользователя
message PostOauth2LoginByPasswordResponse {
  // Ошибка запроса авторизации пользователя
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка капчи
      CaptchaAnswer.Error captcha_answer = 1;
      // Ошибка из ССО
      SsoError sso = 2;
      // Ошибки сервисов ключа
      KeyError key = 3;
      // Ошибки авторизационного сервиса
      AuthServiceError auth_service = 4;
    }
  }

  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
  }
}

// Запрос соглашения пользователя по процедуре OAuth2
message GetOauth2ConsentRequest {
  // Идентификатор текущей попытки запроса соглашения пользователя
  string consent_challenge = 1 [(google.api.field_behavior) = REQUIRED];
}


// Ответ на запрос соглашения пользователя по процедуре OAuth2
message GetOauth2ConsentResponse {
  // Ошибка запроса авторизации пользователя
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибки авторизационного сервиса
      AuthServiceError auth_service = 1;
    }
  }

  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
  }
}
