При разработке мобильных приложений на платформе 1С:Предприятие часто возникает задача надежной идентификации мобильного устройства. Это необходимо для организации программного лицензирования, привязки рабочих мест к конкретным терминалам сбора данных (ТСД), планшетам или смартфонам, а также для обеспечения безопасности обмена данными. Исторически первым решением, которое приходит на ум разработчикам, является получение аппаратного кода IMEI. Однако в современных реалиях этот способ не просто устарел, а стал технически невозможным. Рассмотрим, почему так произошло, и разберем по шагам современные надежные альтернативы.
В старых версиях операционной системы Android (до версии 9 включительно) разработчики могли относительно легко получить доступ к IMEI (International Mobile Equipment Identity), используя стандартные системные вызовы и запрашивая у пользователя разрешение READ_PHONE_STATE. Однако со временем политика конфиденциальности Google претерпела кардинальные изменения.
Начиная с Android 10, Google полностью заблокировал доступ обычных приложений к неизменяемым аппаратным идентификаторам устройства (так называемым non-resettable hardware identifiers), к которым относятся IMEI, серийный номер процессора/платы (Build.getSerial()) и MAC-адрес сетевой карты. Проанализируем ключевые ограничения, с которыми сталкивается разработчик мобильного приложения 1С сегодня:
READ_PHONE_STATE теперь зарезервирован исключительно за системными приложениями (которые предустановлены производителем в прошивку устройства) или специальными приложениями операторов сотовой связи.IMEI.Именно поэтому нам необходимо отказаться от идеи использования IMEI и рассмотреть другие, более современные и безопасные способы идентификации устройств.
В качестве первой и наиболее близкой альтернативы разработчики часто используют системный идентификатор Android ID (также известный как SSAID). Это 64-битное число, которое операционная система генерирует при первой настройке устройства.
Однако здесь важно учитывать технические нюансы безопасности, появившиеся начиная с Android 8.0 (Oreo):
Android ID уникально для каждой связки «приложение + ключ подписи разработчика + пользователь + устройство». Это сделано для того, чтобы разные приложения от разных разработчиков не могли отслеживать пользователя по единому ID.Поскольку во встроенном языке 1С нет прямого метода для чтения Android ID, нам придется использовать внешнюю компоненту (написанную на Java/Kotlin) или вызывать нативный код Android через механизм интеграции. Посмотрим на пример концептуальной схемы работы с внешней компонентой для получения системного идентификатора:
// Пример вызова метода внешней компоненты для получения Android ID
Если ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаИдентификации", "DeviceIDLib", ТипВнешнейКомпоненты.Native) Тогда
Компонента = Новый("AddIn.DeviceIDLib.AndroidHelper");
СистемныйID = Компонента.ПолучитьAndroidID();
ЗаписатьЛогИдентификации(СистемныйID);
КонецЕсли;
Платформа 1С предлагает встроенный инструмент для получения уникального идентификатора без необходимости писать внешние компоненты и запрашивать у пользователя специальные системные разрешения. Речь идет о свойстве ИдентификаторКлиента объекта СистемнаяИнформация.
Рассмотрим пример кода, с помощью которого мы можем быстро считать этот идентификатор на мобильном устройстве:
СисИнфо = Новый СистемнаяИнформация;
УникальныйIDУстройства = СисИнфо.ИдентификаторКлиента;
Сообщить("Идентификатор устройства: " + УникальныйIDУстройства);
Важные особенности поведения этого метода, о которых должен знать каждый разработчик:
Для создания максимально стабильной, кроссплатформенной и независимой от капризов операционных систем архитектуры авторизации устройств рекомендуется использовать метод генерации собственного уникального идентификатора (UUID) с его последующим долгосрочным сохранением.
Проанализируем этот алгоритм по шагам:
Шаг 1. Генерация и сохранение идентификатора при первом запуске
При первом старте мобильного приложения мы проверяем, сохранен ли уже наш собственный идентификатор в локальных настройках (например, в константах мобильного приложения или файловой системе устройства). Если идентификатор отсутствует, мы генерируем его программно:
// Проверяем наличие ранее сгенерированного UUID
НашИдентификатор = ВосстановитьДанныеВыбора("УникальныйИдентификаторУстройства");
Если НашИдентификатор = Неопределено Тогда
// Генерируем новый UUID стандартными средствами 1С
НовыйUUID = Новый УникальныйИдентификатор;
НашИдентификатор = Строка(НовыйUUID);
// Сохраняем сгенерированный идентификатор в локальное хранилище настроек
СохранитьДанныеВыбора("УникальныйИдентификаторУстройства", НашИдентификатор);
КонецЕсли;
// Теперь переменная НашИдентификатор содержит надежный UUID устройства
Шаг 2. Авторизация устройства в центральной базе
Чтобы связать сгенерированный UUID с конкретным физическим пользователем или рабочим местом в центральной базе 1С, используются следующие безопасные сценарии:
Шаг 3. Вспомогательное использование Push-токенов
Если вам дополнительно требуется отправлять на устройства управляющие или информационные сообщения, вы можете задействовать идентификатор подписчика уведомлений:
ИдентификаторPush = МенеджерДоставляемыхУведомлений.ПолучитьИдентификаторПодписчикаУведомлений();
Этот токен уникален для конкретного устройства и приложения, однако он также имеет свойство изменяться при обновлении сервисов Google Play или Apple Push Notification Service (APNs). Поэтому используйте его только в качестве вспомогательного канала связи, но не как единственный ключ для лицензирования или строгой идентификации.
Используя комбинацию из генерации собственного UUID и привязки через QR-коды, мы получаем надежную, безопасную систему идентификации, которая не зависит от версий Android, наличия SIM-карт или ограничений безопасности операционных систем.