Руководство по интеграции EMM

Это руководство помогает поставщикам услуг управления корпоративной мобильностью (EMM) интегрировать автоматическую регистрацию в свою консоль. Продолжайте читать, чтобы узнать больше о регистрации и ознакомиться с рекомендациями, которые помогут вашему DPC (контроллеру политики устройств) подготовить устройства. Если у вас есть ЦОД, вы изучите лучшие практики подготовки устройств и получите советы по разработке и тестированию.

Возможности для ИТ-администраторов

Используйте клиентский API, чтобы помочь ИТ-администраторам настроить автоматическую регистрацию прямо с вашей консоли. Вот некоторые задачи, которые ИТ-администратор может выполнить в вашей консоли:

  • Создавайте, редактируйте и удаляйте конфигурации автоматической регистрации на основе ваших мобильных политик.
  • Установите конфигурацию по умолчанию, чтобы ваш ЦОД подготавливал будущие устройства, которые приобретет организация.
  • Применяйте индивидуальные конфигурации к устройствам или удаляйте устройства из автоматической регистрации.

Чтобы узнать больше о автоматической регистрации, прочитайте обзор .

Предварительные условия

Прежде чем добавлять автоматическую регистрацию в консоль EMM, убедитесь, что ваше решение поддерживает следующее:

  • Ваше решение EMM должно предоставить принадлежащее компании устройство Android 8.0+ (Pixel 7.1+) в полностью управляемом режиме. Корпоративные устройства Android 10+ можно настроить как полностью управляемые или с рабочим профилем .
  • Поскольку автоматическая регистрация автоматически загружает и устанавливает DPC, ваш DPC должен быть доступен в Google Play. Мы поддерживаем список совместимых ЦОД, которые ИТ-администраторы могут настроить с помощью клиентского API или портала. Отправьте запрос на изменение продукта через сообщество поставщиков EMM , чтобы добавить свой ЦОД в список.
  • Вашим клиентам необходима учетная запись автоматической регистрации для вызова клиентского API. Торговый посредник-партнер настраивает учетную запись для организации ИТ-администратора, когда организация приобретает устройства.
  • Устройство должно быть совместимо с Google Mobile Services (GMS), а службы Google Play должны быть всегда включены, чтобы автоматическая регистрация работала правильно.

Вызов API

Пользователи вашей консоли (используя свою учетную запись Google) авторизуют ваши запросы API к клиентскому API. Этот процесс отличается от процесса авторизации, который вы выполняете для других API EMM. Прочтите «Авторизация» , чтобы узнать, как это сделать в вашем приложении.

Обработка условий обслуживания

Вашим пользователям необходимо принять последнюю версию Условий обслуживания (ToS), прежде чем вызывать API. Если вызов API возвращает код состояния HTTP 403 Forbidden , а текст ответа содержит TosError , предложите пользователю принять Условия обслуживания, выполнив вход на портал автоматической регистрации. В примере ниже показан один из способов сделать это:

Джава

// Authorize this method call as a user that hasn't yet accepted the ToS.
final String googleApiFormatHttpHeader = "X-GOOG-API-FORMAT-VERSION";
final String googleApiFormatVersion = "2";
final String tosErrorType =
      "type.googleapis.com/google.android.device.provisioning.v1.TosError";

try {
  // Send an API request to list all the DPCs available including the HTTP header
  // X-GOOG-API-FORMAT-VERSION with the value 2. Import the  exception:
  // from googleapiclient.errors import HttpError
  AndroidProvisioningPartner.Customers.Dpcs.List request =
        service.customers().dpcs().list(customerAccount);
  request.getRequestHeaders().put(googleApiFormatHttpHeader, googleApiFormatVersion);
  CustomerListDpcsResponse response = request.execute();
  return response.getDpcs();

} catch (GoogleJsonResponseException e) {
  // Get the error details. In your app, check details exists first.
  ArrayList<Map> details = (ArrayList<Map>) e.getDetails().get("details");
  for (Map detail : details) {
    if (detail.get("@type").equals(tosErrorType)
          && (boolean) detail.get("latestTosAccepted") != true) {
      // Ask the user to accept the ToS. If they agree, open the portal in a browser.
      // ...
    }
  }
  return null;
}

.СЕТЬ

// Authorize this method call as a user that hasn't yet accepted the ToS.
try
{
    var request = service.Customers.Dpcs.List(customerAccount);
    CustomerListDpcsResponse response = request.Execute();
    return response.Dpcs;
}
catch (GoogleApiException e)
{
    foreach (SingleError error in e.Error?.Errors)
    {
        if (error.Message.StartsWith("The user must agree the terms of service"))
        {
            // Ask the user to accept the ToS. If they agree, open the portal in a browser.
            // ...
        }
    }
}

Питон

# Authorize this method call as a user that hasn't yet accepted the ToS.
tos_error_type = ('type.googleapis.com/'
                  'google.android.device.provisioning.v1.TosError')
portal_url = 'https://partner.android.com/zerotouch'

# Send an API request to list all the DPCs available including the HTTP
# header X-GOOG-API-FORMAT-VERSION with the value 2. Import the exception:
# from googleapiclient.errors import HttpError
try:
  request = service.customers().dpcs().list(parent=customer_account)
  request.headers['X-GOOG-API-FORMAT-VERSION'] = '2'
  response = request.execute()
  return response['dpcs']

except HttpError as err:
  # Parse the JSON content of the error. In your app, check ToS exists first.
  error = json.loads(err.content)
  tos_error = error['error']['details'][0]

  # Ask the user to accept the ToS (not shown here). If they agree, then open
  # the portal in a browser.
  if (tos_error['@type'] == tos_error_type
      and tos_error['latestTosAccepted'] is not True):
    if raw_input('Accept the ToS in the zero-touch portal? y|n ') == 'y':
      webbrowser.open(portal_url)

Если ваш клиент Google API поддерживает подробные ошибки (запросы Java, Python или HTTP), включите в свои запросы HTTP-заголовок X-GOOG-API-FORMAT-VERSION со значением 2 . Если ваш клиент не поддерживает подробные ошибки (.NET и другие), сопоставьте сообщение об ошибке.

Когда мы обновим Условия обслуживания в будущем, если вы будете следовать этому подходу, ваше приложение предложит пользователю повторно принять новые Условия обслуживания.

ИТ-администраторы используют портал автоматической регистрации для управления пользователями своей организации — вы не можете предложить это через клиентский API. ИТ-администраторы также могут управлять устройствами и конфигурациями с помощью портала. Если вам нужна ссылка на портал с консоли или в документации, используйте этот URL:

https://partner.android.com/zerotouch

Возможно, вы захотите сообщить ИТ-администраторам, что им будет предложено войти в систему, используя свою учетную запись Google.

Регистрация устройства

Регистрация без касания — это механизм регистрации устройств, аналогичный регистрации NFC или регистрации с помощью QR-кода. Ваша консоль должна поддерживать управляемые устройства, а ваш ЦОД должен иметь возможность работать в режиме полностью управляемого устройства.

Автоматическая регистрация доступна на поддерживаемых устройствах под управлением Android 8.0 или более поздней версии. ИТ-администраторы должны приобретать поддерживаемые устройства у реселлера-партнера . Ваша консоль может отслеживать, какие устройства ИТ-администратора доступны для автоматической регистрации, вызвав customers.devices.list .

Вот краткое описание того, как работает регистрация:

  1. Устройство регистрируется на сервере Google при первом запуске (или после сброса настроек) для автоматической регистрации.
  2. Если ИТ-администратор применил конфигурацию к устройству, автоматическая регистрация запускает мастер настройки Android полностью управляемого устройства и персонализирует экраны с помощью метаданных из конфигурации.
  3. Автоматическая регистрация загружает и устанавливает ваш ЦОД из Google Play.
  4. Ваш ЦОД получает намерение ACTION_PROVISION_MANAGED_DEVICE и подготавливает устройство.

Если подключение к Интернету отсутствует, проверка происходит, когда оно становится доступным. Дополнительные сведения о подготовке устройств с автоматической регистрацией см. в разделе «Инициализация» ниже.

Конфигурации по умолчанию

Автоматическая регистрация больше всего помогает ИТ-администраторам, когда они устанавливают конфигурацию по умолчанию, которая применяется ко всем новым устройствам, приобретаемым их организацией. Поощряйте установку конфигурации по умолчанию с вашей консоли, если она еще не установлена. Вы можете проверить значение customers.configurations.isDefault , чтобы узнать, установила ли организация конфигурацию по умолчанию.

В примере ниже показано, как можно сделать существующую конфигурацию по умолчанию:

Джава

// Send minimal data with the request. Just the 2 required fields.
// targetConfiguration is an existing configuration that we want to make the default.
Configuration configuration = new Configuration();
configuration.setIsDefault(true);
configuration.setConfigurationId(targetConfiguration.getConfigurationId());

// Call the API, including the FieldMask to avoid setting other fields to null.
AndroidProvisioningPartner.Customers.Configurations.Patch request = service
      .customers()
      .configurations()
      .patch(targetConfiguration.getName(), configuration);
request.setUpdateMask("isDefault");
Configuration results = request.execute();

.СЕТЬ

// Send minimal data with the request. Just the 2 required fields.
// targetConfiguration is an existing configuration that we want to make the default.
Configuration configuration = new Configuration
{
    IsDefault = true,
    ConfigurationId = targetConfiguration.ConfigurationId,
};

// Call the API, including the FieldMask to avoid setting other fields to null.
var request = service.Customers.Configurations.Patch(configuration,
                                                     targetConfiguration.Name);
request.UpdateMask = "IsDefault";
Configuration results = request.Execute();

Питон

# Send minimal data with the request. Just the 2 required fields.
# target_configuration is an existing configuration we'll make the default.
configuration = {
    'isDefault': True,
    'configurationId': target_configuration['configurationId']}

# Call the API, including the FieldMask to avoid setting other fields to null.
response = service.customers().configurations().patch(
    name=target_configuration['name'],
    body=configuration, updateMask='isDefault').execute()

Ссылка на ваш ЦОД

Мы рекомендуем использовать имя ресурса API customers.dpcs.name для идентификации вашего ЦОД и использования его в конфигурациях. Имя ресурса содержит уникальный и неизменный идентификатор ЦОД. Вызовите customers.dpcs.list , чтобы получить список всех поддерживаемых ЦОД. Поскольку имя ресурса также включает идентификатор клиента, отфильтруйте список, используя последний компонент пути, чтобы найти соответствующий экземпляр Dpc . В приведенном ниже примере показано, как сопоставить ваш DPC и сохранить его для последующего использования в конфигурации:

Джава

// Return a customer Dpc instance for the specified DPC ID.
String myDpcIdentifier = "AH6Gbe4aiS459wlz58L30cqbbXbUa_JR9...xMSWCiYiuHRWeBbu86Yjq";
final int dpcIdIndex = 3;
final String dpcComponentSeparator = "/";
// ...
for (Dpc dpcApp : dpcs) {
    // Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID}, check the
    // fourth component matches the DPC ID.
    String dpcId = dpcApp.getName().split(dpcComponentSeparator)[dpcIdIndex];
    if (dpcId.equals(myDpcIdentifier)) {
        System.out.format("My DPC is: %s\n", dpcApp.getDpcName());
        return dpcApp;
    }
}
// Handle the case when the DPC isn't found...

.СЕТЬ

// Return a customer Dpc instance for the specified DPC ID.
var myDpcIdentifer = "AH6Gbe4aiS459wlz58L30cqbbXbUa_JR9...fE9WdHcxMSWCiYiuHRWeBbu86Yjq";
const int dpcIdIndex = 3;
const String dpcComponentSeparator = "/";
// ...
foreach (Dpc dpcApp in dpcs)
{
    // Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID}, check the
    // fourth component matches the DPC ID.
    String dpcId = dpcApp.Name.Split(dpcComponentSeparator)[dpcIdIndex];
    if (dpcId.Equals(myDpcIdentifer))
    {
        Console.WriteLine("Matched DPC is: {0}", dpcApp.DpcName);
        return dpcApp;
    }
}
// Handle the case when the DPC isn't found...

Питон

# Return a customer Dpc instance for the specified DPC ID.
my_dpc_id = 'AH6Gbe4aiS459wlz58L30cqb...fE9WdHcxMSWCiYiuHRWeBbu86Yjq'
# ...
for dpc_app in dpcs:
  # Because the DPC name is in the format customers/{CUST_ID}/dpcs/{DPC_ID},
  # check the fourth component matches the DPC ID.
  dpc_id = dpc_app['name'].split('/')[3]
  if dpc_id == my_dpc_id:
    return dpc_app

# Handle the case when the DPC isn't found...

Если вам нужно отобразить имя ЦОД в пользовательском интерфейсе вашей консоли, отобразите значение, возвращаемое из customers.dpcs.dpcName .

Обеспечение

Воспользуйтесь возможностью предоставить удобный пользовательский интерфейс для подготовки устройств. Имя пользователя и пароль — это все, что необходимо для подготовки устройства. Помните, что реселлеры могут отправлять устройства напрямую удаленным пользователям. Включите все остальные параметры, такие как сервер EMM или организационное подразделение, в customers.configuration.dpcExtras .

В приведенном ниже фрагменте JSON показана часть примера конфигурации:

{
  "android.app.extra.PROVISIONING_LOCALE": "en_GB",
  "android.app.extra.PROVISIONING_TIME_ZONE": "Europe/London",
  "android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED": true,
  "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE": {
    "workflow_type": 3,
    "default_password_quality": 327680,
    "default_min_password_length": 6,
    "company_name": "XYZ Corp",
    "organizational_unit": "sales-uk",
    "management_server": "emm.example.com",
    "detail_tos_url": "https://www.example.com/policies/terms/",
    "allowed_user_domains": "[\"example.com\", \"example.org\", \"example.net\"]"
    }
}

Регистрация без участия пользователя устанавливает и запускает ваш ЦОД с использованием Android Intent. Система отправляет значения в свойстве JSON android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE в ваш ЦОД в качестве дополнительных элементов намерения. Ваш ЦОД может читать настройки обеспечения из PersistableBundle , используя те же ключи.

Рекомендуется — используйте следующие дополнительные возможности для настройки ЦОД:

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

Чтобы узнать, как извлечь и использовать эти настройки в своем ЦОД, прочтите «Предоставление клиентских устройств» .

Разработка и тестирование

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

  • поддерживаемое устройство
  • учетная запись автоматической регистрации клиента

Разрабатывайте и тестируйте устройства, поддерживающие автоматическую регистрацию , например Google Pixel. Вам не обязательно приобретать устройства для разработки у партнера-посредника.

Свяжитесь с нами , чтобы получить тестовую учетную запись клиента и доступ к порталу автоматической регистрации. Напишите нам со своего корпоративного адреса электронной почты, связанного с учетной записью Google. Сообщите нам производителя и номер IMEI одного или двух устройств, и мы добавим их в вашу учетную запись разработчика.

Помните, поскольку автоматическая регистрация автоматически загружает и устанавливает DPC, ваш DPC должен быть доступен в Google Play, прежде чем вы сможете протестировать подготовку. Вы не можете проводить тестирование с помощью разрабатываемой версии вашего ЦОД.

Поддержка ИТ-администраторов

Если вам нужно помочь ИТ-администраторам в интерфейсе вашей консоли или документации, ознакомьтесь с инструкциями по автоматической регистрации для ИТ-администраторов . Вы также можете направить пользователей вашей консоли к этой статье справочного центра.

дальнейшее чтение

Прочтите эти документы, которые помогут вам интегрировать автоматическую регистрацию в вашей консоли: