Аутентификация - Сценарии ExtSdk2 — различия между версиями

Материал из razgovorov.ru
Перейти к: навигация, поиск
 
(не показана 21 промежуточная версия этого же участника)
Строка 8: Строка 8:
  
 
После получения COM-объекта и подключения к модулю ExtSdk2 мы можем перейти к методам авторизации. Более детальное описание находится в сценарии Подключение к ExtSdk2 через OLE.
 
После получения COM-объекта и подключения к модулю ExtSdk2 мы можем перейти к методам авторизации. Более детальное описание находится в сценарии Подключение к ExtSdk2 через OLE.
Для любой авторизации стоит использовать методы COM-объекта CallMethodWithoutAuth или CallMethodWithoutAuthXML, если параметры передаются в формате xml.
+
Для любой авторизации стоит использовать методы COM-объекта [[CallMethodWithoutAuth]] или [[CallMethodWithoutAuthXML]], если параметры передаются в формате xml.
 
== Аутентификация по логину паролю ==
 
== Аутентификация по логину паролю ==
Авторизация по логину паролю выполняется с использованием метода AuthByPassword, принимающего логин и пароль в качестве параметров.
+
Авторизация по логину паролю выполняется с использованием метода [[AuthByPassword_-_аутентификация_по_паролю_(ExtSdk2)|AuthByPassword]], принимающего логин и пароль в качестве параметров.
 
=== Пример кода для авторизации по логину паролю ===
 
=== Пример кода для авторизации по логину паролю ===
<source lang="json">
+
<syntaxhighlight lang="python" line='line'>
     def test_auth_by_password_success(self):
+
 
        """Авторизация с правильным логином и паролем"""
+
     ole = win32com.client.Dispatch("Tensor.SbisPluginClientCOM")
        query_id = self.plugin.call_method("CallMethodWithoutAuth", "ExtSdk2.AuthByPassword", json.dumps(
+
 
            {"Login": "login", "password"}, ensure_ascii=True))
+
    query_id = str(uuid.uuid4())
        result = self.plugin.read_all_xml([query_id])
+
    guid_module = ole.GetModule("ExtSdk2")
</source>
+
    module_method = "ExtSdk2.AuthByPassword"
 +
    parameters_module_method = json.dumps({"Login": "login", "Password": "password"}, ensure_ascii=True)
 +
    host = online.sbis.ru
 +
 
 +
    ole.CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, host )
 +
 
 +
    json_string = ole.ReadAllObject()
 +
     
 +
</syntaxhighlight>
  
 
=== Пример успешной авторизации по логину паролю ===
 
=== Пример успешной авторизации по логину паролю ===
Параметры запроса в CallMethodWithoutAuth
+
Параметры запроса в [[CallMethodWithoutAuth]]
 
<source lang="json">
 
<source lang="json">
 +
# parameters_module_method
 +
 
{
 
{
 
   "Login": "Иванов",
 
   "Login": "Иванов",
Строка 32: Строка 42:
 
<source lang="json">
 
<source lang="json">
 
{
 
{
   'Result': '********@plugin.sbis.ru',
+
   'Result': 'Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY',
   'Stat': {
+
   'Stat': ...
    'ExtSdk2': {
 
      'ExtSdk2.AuthByPassword': {
 
        'count': 2,
 
        'time': 0
 
      }
 
    }
 
  }
 
 
}
 
}
 
</source>
 
</source>
где '********@plugin.sbis.ru' в Result это идентификатор сессии, с которым в последующем необходимо вызывать остальные методы модуля ExtSdk2 через методы COM-объекта CallMethod и CallMethodXML
+
где «Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY» — это идентификатор сессии, используйте его при вызове остальных методов модуля ExtSdk2 через методы COM-объекта [[CallMethod|CallMethod]] и [[CallMethodXML|CallMethodXML]].
  
 
== Аутентификация по сертификату ==
 
== Аутентификация по сертификату ==
Для аутентификации по сертификату пользователю сначала нужно показать список сертификатов подходящих для аутентификации. Получить такой список можно при помощи метода ReadCertListForAuth.
+
Для аутентификации по сертификату пользователю сначала нужно показать список сертификатов подходящих для аутентификации. Получить такой список можно при помощи метода [[ReadCertListForAuth_-_Получить_список_сертификатов_для_аутентификации_(ExtSdk2)|ReadCertListForAuth]].
  
После того как пользователь выбрал сертификат для аутентификации вызывается метод AuthByCert, принимающий отпечаток сертификата, по которому хотим авторизоваться.
+
После того как пользователь выбрал сертификат для аутентификации вызывается метод [[AuthByCert_-_аутентификация_по_сертификату_(ExtSdk2)|AuthByCert]], принимающий отпечаток сертификата, по которому необходимо авторизоваться.
  
 
=== Пример кода для авторизации по сертификату ===
 
=== Пример кода для авторизации по сертификату ===
 
<source lang="json">
 
<source lang="json">
        def test_auth_by_cert_success(self):
+
 
        """Авторизация с правильным сертификатом"""
+
    ole = win32com.client.Dispatch("Tensor.SbisPluginClientCOM")
        query_id = self.plugin.call_method("CallMethodWithoutAuth", "ExtSdk2.AuthByCert", json.dumps(
+
 
            {"Imprint": "Отпечаток сертификата"}, ensure_ascii=True))
+
    query_id = str(uuid.uuid4())
        result2 = self.plugin.read_all_xml([query_id])
+
    guid_module = ole.GetModule("ExtSdk2")
 +
    module_method = "ExtSdk2.AuthByCert"
 +
    parameters_module_method = json.dumps({"Imprint": "Отпечаток сертификата"}, ensure_ascii=True)
 +
    host = online.sbis.ru
 +
 
 +
    ole.CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, host )
 +
 
 +
    json_string = ole.ReadAllObject()
 +
 
 
</source>
 
</source>
  
 
=== Пример успешной авторизации по сертификату ===
 
=== Пример успешной авторизации по сертификату ===
Параметры запроса в CallMethodWithoutAuth
+
Параметры запроса в [[CallMethodWithoutAuth]]
 
<source lang="json">
 
<source lang="json">
 +
# parameters_module_method
 +
 
{
 
{
 
   "Imprint": "Строка в 40 знаков",
 
   "Imprint": "Строка в 40 знаков",
Строка 70: Строка 83:
 
<source lang="json">
 
<source lang="json">
 
{
 
{
   'Result': '********@plugin.sbis.ru',
+
   'Result': 'Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY',
   'Stat': {
+
   'Stat': ...
    'CryptoPlugin': {
 
      'CryptoPlugin.ParseCertificate': {
 
        'count': 1,
 
        'time': 5
 
      },
 
      'CryptoPlugin.StoreCertificate': {
 
        'count': 1,
 
        'time': 1
 
      }
 
    },
 
    'ExtSdk2': {
 
      'ExtSdk2.AuthByCert': {
 
        'count': 2,
 
        'time': 3732
 
      }
 
    }
 
  }
 
 
}
 
}
 
</source>
 
</source>
где '********@plugin.sbis.ru' в Result это идентификатор сессии, с которым в последующем необходимо вызывать остальные методы модуля ExtSdk2 через методы COM-объекта CallMethod и CallMethodXML
+
где «Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY» — это идентификатор сессии, используйте его при вызове остальных методов модуля ExtSdk2 через методы COM-объекта [[CallMethod|CallMethod]] и [[CallMethodXML|CallMethodXML]].
  
 
==Аутентификация по токену==
 
==Аутентификация по токену==
Для авторизации по токену необходимо сначала получить токен от администратора интересующего аккаунта.
+
Для авторизации по токену необходимо сначала получить [https://sbis.ru/help/integration/api/auth/service?tb=tab1 токен] от администратора интересующего аккаунта.
  
После получения токена вызывается метод AuthByToken.
+
После получения токена вызывается метод [[AuthByToken_-_аутентификация_по_токену_(ExtSdk2)|AuthByToken]].
  
 
=== Пример кода для авторизации по токену===
 
=== Пример кода для авторизации по токену===
 
<source lang="json">
 
<source lang="json">
        def test_auth_by_token_success(self):
+
 
        """Авторизация с правильным токеном"""
+
    ole = win32com.client.Dispatch("Tensor.SbisPluginClientCOM")
        query_id = self.plugin.call_method("CallMethodWithoutAuth", "ExtSdk2.AuthByToken", json.dumps(
+
 
            {"Token": "Отпечаток сертификата"}, ensure_ascii=True))
+
    query_id = str(uuid.uuid4())
        result2 = self.plugin.read_all_xml([query_id])
+
    guid_module = ole.GetModule("ExtSdk2")
 +
    module_method = "ExtSdk2.AuthByToken"
 +
    parameters_module_method = json.dumps({"Token": "токен"}, ensure_ascii=True)
 +
    host = online.sbis.ru
 +
 
 +
    ole.CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, host )
 +
 
 +
    json_string = ole.ReadAllObject()
 
</source>
 
</source>
  
Строка 110: Строка 113:
 
Параметры запроса в CallMethodWithoutAuth
 
Параметры запроса в CallMethodWithoutAuth
 
<source lang="json">
 
<source lang="json">
 +
# parameters_module_method
 +
 
{
 
{
 
   "Token": "taMjS16IMM3RMWg0STDD0UBRDc0CN5TVnjQbIoZT6NdtUbAtkLZ4lTVYhJYRx5IMzR3wlNEYEMSm1M5sMNjWjfuA3QpZjMkht57DWqntTNj2UkMTpSuE4FEF",
 
   "Token": "taMjS16IMM3RMWg0STDD0UBRDc0CN5TVnjQbIoZT6NdtUbAtkLZ4lTVYhJYRx5IMzR3wlNEYEMSm1M5sMNjWjfuA3QpZjMkht57DWqntTNj2UkMTpSuE4FEF",
Строка 118: Строка 123:
 
<source lang="json">
 
<source lang="json">
 
{
 
{
   'Result': '********@plugin.sbis.ru',
+
   'Result': 'Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY',
   'Stat': {
+
   'Stat': ...
    'ExtSdk2': {
 
      'ExtSdk2.AuthByToken': {
 
        'count': 2,
 
        'time': 0
 
      }
 
    }
 
  }
 
 
}
 
}
 
</source>
 
</source>
где '********@plugin.sbis.ru' в Result это идентификатор сессии, с которым в последующем необходимо вызывать остальные методы модуля ExtSdk2 через методы COM-объекта CallMethod и CallMethodXML
+
где «Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY» — это идентификатор сессии, используйте его при вызове остальных методов модуля ExtSdk2 через методы COM-объекта [[CallMethod|CallMethod]] и [[CallMethodXML|CallMethodXML]].
  
 
==Двухфакторная аутентификация ==  
 
==Двухфакторная аутентификация ==  
Если у пользователя настроена двухфакторная аутентификация вы получите ошибку вида ExtException
+
Если у пользователя настроена двухфакторная аутентификация вы получите ошибку вида json
 
<source lang="json">
 
<source lang="json">
 
{
 
{
Строка 142: Строка 140:
 
     'SessionID': '00610413-006104f7-eeba-fbd5a09730f7eaba'
 
     'SessionID': '00610413-006104f7-eeba-fbd5a09730f7eaba'
 
   },
 
   },
   'message': 'Требуется подтверждение действия',
+
   ...
  'method_name': 'AuthByPassword',
 
  'stack': [
 
    {
 
      'dump': {
 
        'MethodToValidate': 'САП.AuthenticateExPart2',
 
        'ResourceID': '3a23a986-3b0f-4763-89a5-519f7da8a271',
 
        'SessionID': '00610413-006104f7-eeba-fbd5a09730f7eaba'
 
      },
 
      'method_name': 'AuthByPassword'
 
    }
 
  ]
 
 
}
 
}
 
</source>
 
</source>
  
Нас интересует dump ошибки, из которого нужно взять все три поля.
+
Необходимые данные лежат в dump ошибки, из которого нужно взять все три поля.
  
Далее следует вызвать метод AuthSendCode, принимающий на вход ResourceID и SessionID и возвращающий ResourceID, который следует сравнить с имеющимся.
+
Далее следует вызвать метод [[AuthSendCode_-_Отправить_пользователю_код_подтверждения_(ExtSdk2)|AuthSendCode]], принимающий на вход ResourceID и SessionID и возвращающий ResourceID, который следует сравнить с имеющимся.
 
=== Пример кода для AuthSendCode===
 
=== Пример кода для AuthSendCode===
 
<source lang="json">
 
<source lang="json">
        def test_auth_send_code(self):
+
 
        query_id = self.plugin.call_method("CallMethodWithoutAuth", "ExtSdk2.AuthSendCode", json.dumps(
+
    query_id = str(uuid.uuid4())
            {"ResourceID": "3a23a986-3b0f-4763-89a5-519f7da8a271", "SessionID": 00610413-006104f7-eeba-fbd5a09730f7eaba}, ensure_ascii=True))
+
    guid_module = ole.GetModule("ExtSdk2")
        result2 = self.plugin.read_all_xml([query_id])
+
    module_method = "ExtSdk2.AuthSendCode"
 +
    parameters_module_method = json.dumps({"ResourceID": "3a23a986-3b0f-4763-89a5-519f7da8a271", "SessionID": 00610413-006104f7-eeba-fbd5a09730f7eaba}, ensure_ascii=True)
 +
    host = online.sbis.ru
 +
 
 +
    ole.CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, host )
 +
 
 +
    json_string = ole.ReadAllObject()
 
</source>
 
</source>
  
 
=== Пример успешного вызова AuthSendCode ===
 
=== Пример успешного вызова AuthSendCode ===
 
<source lang="json">
 
<source lang="json">
 +
# parameters_module_method
 +
 
{
 
{
 
   "ResourceID": "3a23a986-3b0f-4763-89a5-519f7da8a271",
 
   "ResourceID": "3a23a986-3b0f-4763-89a5-519f7da8a271",
Строка 180: Строка 175:
 
{
 
{
 
   'Result': '3a23a986-3b0f-4763-89a5-519f7da8a271',
 
   'Result': '3a23a986-3b0f-4763-89a5-519f7da8a271',
   'Stat': {
+
   'Stat': ...
    'ExtSdk2': {
 
      'ExtSdk2.AuthByToken': {
 
        'count': 2,
 
        'time': 0
 
      }
 
    }
 
  }
 
 
}
 
}
 
</source>
 
</source>
Строка 193: Строка 181:
 
В Result лежит исходный ResourceID
 
В Result лежит исходный ResourceID
  
При успешном выполнении AuthSendCode и получении кода аутентификации по SMS необходимо вызвать метод AuthConfirmCode, принимающий json-объект с кодом, ResourceID и MethodToValidate, который будет вызван в последствии.
+
При успешном выполнении [[AuthSendCode_-_Отправить_пользователю_код_подтверждения_(ExtSdk2)|AuthSendCode]] и получении кода аутентификации по SMS необходимо вызвать метод [[AuthConfirmCode_-_подтвердить_код_двухфакторной_аутентификации_(ExtSdk2)|AuthConfirmCode]], принимающий json-объект с кодом, ResourceID и MethodToValidate, который будет вызван в последствии.
  
 
=== Пример кода для AuthConfirmCode===
 
=== Пример кода для AuthConfirmCode===
 
<source lang="json">
 
<source lang="json">
        def test_auth_confirm_code(self):
+
 
        """Авторизация с правильным сертификатом"""
+
    query_id = str(uuid.uuid4())
        query_id = self.plugin.call_method("CallMethodWithoutAuth", "ExtSdk2.AuthConfirmCode", json.dumps(
+
    guid_module = ole.GetModule("ExtSdk2")
            {"Param": { "Код": "пришедший код", "Идентификатор": "3a23a986-3b0f-4763-89a5-519f7da8a271", "ВызываемыйМетод": "САП.AuthenticateExPart2" } }, ensure_ascii=True))
+
    module_method = "ExtSdk2.AuthConfirmCode"
        result2 = self.plugin.read_all_xml([query_id])
+
    parameters_module_method = json.dumps({"Param": { "Код": "пришедший код", "Идентификатор": "3a23a986-3b0f-4763-89a5-519f7da8a271", "ВызываемыйМетод": "САП.AuthenticateExPart2" } }, ensure_ascii=True)
 +
    host = online.sbis.ru
 +
 
 +
    ole.CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, host )
 +
 
 +
    json_string = ole.ReadAllObject()
 
</source>
 
</source>
  
 
=== Пример успешного вызова AuthConfirmCode===
 
=== Пример успешного вызова AuthConfirmCode===
 
<source lang="json">
 
<source lang="json">
 +
# parameters_module_method
 +
 
{
 
{
   "ResourceID": "3a23a986-3b0f-4763-89a5-519f7da8a271",
+
   "Param": {
  "SessionID": "00610413-006104f7-eeba-fbd5a09730f7eaba"
+
      "Код": "пришедший код",
 +
      "Идентификатор": "3a23a986-3b0f-4763-89a5-519f7da8a271",
 +
      "ВызываемыйМетод": "САП.AuthenticateExPart2"
 +
  }
 
}
 
}
 
</source>
 
</source>
Строка 215: Строка 213:
 
<source lang="json">
 
<source lang="json">
 
{
 
{
   'Result': '3a23a986-3b0f-4763-89a5-519f7da8a271',
+
   'Result': 'Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY',
   'Stat': {
+
   'Stat': ...
    'ExtSdk2': {
 
      'ExtSdk2.AuthByToken': {
 
        'count': 2,
 
        'time': 0
 
      }
 
    }
 
  }
 
 
}
 
}
 
</source>
 
</source>
 +
где «Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY» — это идентификатор сессии, используйте его при вызове остальных методов модуля ExtSdk2 через методы COM-объекта [[CallMethod|CallMethod]] и [[CallMethodXML|CallMethodXML]].
  
 
[[Категория:Сценарии ExtSdk2]]
 
[[Категория:Сценарии ExtSdk2]]

Текущая версия на 15:47, 14 февраля 2022

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

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

Общая стратегия аутентификации следующая – Если у Вас есть сохраненный идентификатор сессии, то начинаете работу – делаете вызовы. Методы аутентификации Вы вызываете, если у Вас нет идентификатора сессии или если вы получили ошибку аутентификации.

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

После получения COM-объекта и подключения к модулю ExtSdk2 мы можем перейти к методам авторизации. Более детальное описание находится в сценарии Подключение к ExtSdk2 через OLE. Для любой авторизации стоит использовать методы COM-объекта CallMethodWithoutAuth или CallMethodWithoutAuthXML, если параметры передаются в формате xml.

Аутентификация по логину паролю

Авторизация по логину паролю выполняется с использованием метода AuthByPassword, принимающего логин и пароль в качестве параметров.

Пример кода для авторизации по логину паролю

    ole = win32com.client.Dispatch("Tensor.SbisPluginClientCOM")

    query_id = str(uuid.uuid4())
    guid_module = ole.GetModule("ExtSdk2")
    module_method = "ExtSdk2.AuthByPassword"
    parameters_module_method = json.dumps({"Login": "login", "Password": "password"}, ensure_ascii=True)
    host = online.sbis.ru

    ole.CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, host )

    json_string = ole.ReadAllObject()

Пример успешной авторизации по логину паролю

Параметры запроса в CallMethodWithoutAuth

# parameters_module_method

{
   "Login": "Иванов",
   "Password": "123"
}

Ответ

{
  'Result': 'Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY',
  'Stat': ...
}

где «Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY» — это идентификатор сессии, используйте его при вызове остальных методов модуля ExtSdk2 через методы COM-объекта CallMethod и CallMethodXML.

Аутентификация по сертификату

Для аутентификации по сертификату пользователю сначала нужно показать список сертификатов подходящих для аутентификации. Получить такой список можно при помощи метода ReadCertListForAuth.

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

Пример кода для авторизации по сертификату

    ole = win32com.client.Dispatch("Tensor.SbisPluginClientCOM")

    query_id = str(uuid.uuid4())
    guid_module = ole.GetModule("ExtSdk2")
    module_method = "ExtSdk2.AuthByCert"
    parameters_module_method = json.dumps({"Imprint": "Отпечаток сертификата"}, ensure_ascii=True)
    host = online.sbis.ru

    ole.CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, host )

    json_string = ole.ReadAllObject()

Пример успешной авторизации по сертификату

Параметры запроса в CallMethodWithoutAuth

# parameters_module_method

{
   "Imprint": "Строка в 40 знаков",
}

Ответ

{
  'Result': 'Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY',
  'Stat': ...
}

где «Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY» — это идентификатор сессии, используйте его при вызове остальных методов модуля ExtSdk2 через методы COM-объекта CallMethod и CallMethodXML.

Аутентификация по токену

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

После получения токена вызывается метод AuthByToken.

Пример кода для авторизации по токену

    ole = win32com.client.Dispatch("Tensor.SbisPluginClientCOM")

    query_id = str(uuid.uuid4())
    guid_module = ole.GetModule("ExtSdk2")
    module_method = "ExtSdk2.AuthByToken"
    parameters_module_method = json.dumps({"Token": "токен"}, ensure_ascii=True)
    host = online.sbis.ru

    ole.CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, host )

    json_string = ole.ReadAllObject()

Пример успешной авторизации по токену

Параметры запроса в CallMethodWithoutAuth

# parameters_module_method

{
   "Token": "taMjS16IMM3RMWg0STDD0UBRDc0CN5TVnjQbIoZT6NdtUbAtkLZ4lTVYhJYRx5IMzR3wlNEYEMSm1M5sMNjWjfuA3QpZjMkht57DWqntTNj2UkMTpSuE4FEF",
}

Ответ

{
  'Result': 'Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY',
  'Stat': ...
}

где «Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY» — это идентификатор сессии, используйте его при вызове остальных методов модуля ExtSdk2 через методы COM-объекта CallMethod и CallMethodXML.

Двухфакторная аутентификация

Если у пользователя настроена двухфакторная аутентификация вы получите ошибку вида json

{
  'code': 303,
  'detail': 'Требуется подтверждение действия',
  'dump': {
    'MethodToValidate': 'САП.AuthenticateExPart2',
    'ResourceID': '3a23a986-3b0f-4763-89a5-519f7da8a271',
    'SessionID': '00610413-006104f7-eeba-fbd5a09730f7eaba'
  },
  ...
}

Необходимые данные лежат в dump ошибки, из которого нужно взять все три поля.

Далее следует вызвать метод AuthSendCode, принимающий на вход ResourceID и SessionID и возвращающий ResourceID, который следует сравнить с имеющимся.

Пример кода для AuthSendCode

    query_id = str(uuid.uuid4())
    guid_module = ole.GetModule("ExtSdk2")
    module_method = "ExtSdk2.AuthSendCode"
    parameters_module_method = json.dumps({"ResourceID": "3a23a986-3b0f-4763-89a5-519f7da8a271", "SessionID": 00610413-006104f7-eeba-fbd5a09730f7eaba}, ensure_ascii=True)
    host = online.sbis.ru

    ole.CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, host )

    json_string = ole.ReadAllObject()

Пример успешного вызова AuthSendCode

# parameters_module_method

{
   "ResourceID": "3a23a986-3b0f-4763-89a5-519f7da8a271",
   "SessionID": "00610413-006104f7-eeba-fbd5a09730f7eaba"
}

Ответ

{
  'Result': '3a23a986-3b0f-4763-89a5-519f7da8a271',
  'Stat': ...
}

В Result лежит исходный ResourceID

При успешном выполнении AuthSendCode и получении кода аутентификации по SMS необходимо вызвать метод AuthConfirmCode, принимающий json-объект с кодом, ResourceID и MethodToValidate, который будет вызван в последствии.

Пример кода для AuthConfirmCode

    query_id = str(uuid.uuid4())
    guid_module = ole.GetModule("ExtSdk2")
    module_method = "ExtSdk2.AuthConfirmCode"
    parameters_module_method = json.dumps({"Param": { "Код": "пришедший код", "Идентификатор": "3a23a986-3b0f-4763-89a5-519f7da8a271", "ВызываемыйМетод": "САП.AuthenticateExPart2" } }, ensure_ascii=True)
    host = online.sbis.ru

    ole.CallMethodWithoutAuth( query_id, guid_module, module_method, parameters_module_method, host )

    json_string = ole.ReadAllObject()

Пример успешного вызова AuthConfirmCode

# parameters_module_method

{
   "Param": {
      "Код": "пришедший код",
      "Идентификатор": "3a23a986-3b0f-4763-89a5-519f7da8a271",
      "ВызываемыйМетод": "САП.AuthenticateExPart2"
   }
}

Ответ

{
  'Result': 'Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY',
  'Stat': ...
}

где «Yzg0NGI3MjU0NmM4NDQyNTg5MjQ4NTM0NGRiMjcwYWY» — это идентификатор сессии, используйте его при вызове остальных методов модуля ExtSdk2 через методы COM-объекта CallMethod и CallMethodXML.